Rust 团队很高兴宣布 Rust 的新版本 1.54.0。Rust 是一种编程语言,它赋予每个人构建可靠且高效软件的能力。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.54.0 就像
$ rustup update stable
如果您还没有安装,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上的1.54.0 的详细发布说明。
1.54.0 稳定版中的新内容
属性可以调用函数式宏
Rust 1.54 支持在属性内部调用函数式宏。函数式宏可以是基于 macro_rules!
的,也可以是像 macro!(...)
一样调用的过程宏。一个值得注意的用例是将来自其他文件的文档包含到 Rust 文档注释中。例如,如果您的项目的 README 代表一个好的文档注释,您可以使用 include_str!
直接包含其内容。以前,各种变通方法允许类似的功能,但从 1.54 开始,这变得更加符合人体工程学。
#![doc = include_str!("README.md")]
宏也可以嵌套在属性内部。例如,concat!
宏可以用来从使用 stringify!
包含替换的宏中构建文档注释
macro_rules! make_function {
($name:ident, $value:expr) => {
#[doc = concat!("The `", stringify!($name), "` example.")]
///
/// # Example
///
/// ```
#[doc = concat!(
"assert_eq!(", module_path!(), "::", stringify!($name), "(), ",
stringify!($value), ");")
]
/// ```
pub fn $name() -> i32 {
$value
}
};
}
make_function! {func_name, 123}
阅读此处以了解更多详细信息。
wasm32 内联函数已稳定
wasm32 平台的一些内联函数已稳定,这使得可以访问 WebAssembly 中的 SIMD 指令。
值得注意的是,与之前稳定的 x86
和 x86_64
内联函数不同,这些内联函数没有安全要求,即只有在启用了相应的目标特性时才能调用。这是因为 WebAssembly 从一开始就被设计成在执行之前安全地验证代码,因此指令保证被正确解码(或根本不解码)。
这意味着我们可以将一些内联函数公开为完全安全的函数,例如v128_bitselect
。但是,仍然有一些内联函数是不安全的,因为它们使用原始指针,例如v128_load
。
增量编译默认情况下重新启用
在 1.52.1 中默认情况下被禁用之后,增量编译在这个版本中默认情况下重新启用。
在 Rust 1.52 中,从磁盘缓存加载增量编译数据时添加了额外的验证。这导致许多现有的潜在健全性问题被发现,因为验证将这些静默错误变成了内部编译器错误 (ICE)。作为回应,编译器团队决定在 1.52.1 补丁中禁用增量编译,允许用户避免遇到 ICE 和潜在的不健全性,但代价是编译时间更长。 1
从那时起,我们进行了一系列回顾,贡献者一直在努力解决报告的问题,其中一些修复在 1.53 中发布,大多数修复在这个版本中发布。 2
目前仍然有两个已知问题会导致 ICE。由于缺乏自动崩溃报告,我们无法确定未解决问题的全部影响范围。但是,根据我们从受 1.52 版本影响的用户那里收到的反馈,我们认为剩余问题在实践中很少见。
因此,增量编译在这个版本中重新启用!
稳定的 API
以下方法和特征实现已稳定。
BTreeMap::into_keys
BTreeMap::into_values
HashMap::into_keys
HashMap::into_values
arch::wasm32
VecDeque::binary_search
VecDeque::binary_search_by
VecDeque::binary_search_by_key
VecDeque::partition_point
其他更改
Rust 1.54.0 版本中还有其他更改:查看Rust、Cargo 和Clippy 中的更改。
rustfmt 也在 1.54.0 版本中修复,以正确格式化嵌套的内联模块。这可能会导致对 1.53.0 rustfmt 忽略的文件的格式进行更改。查看此处的详细信息。
1.54.0 的贡献者
许多人共同创建了 Rust 1.54.0。没有你们,我们无法做到。 感谢!
-
1.52.1 发布说明包含对这些事件的更详细描述。 ↩