Rust 团队很高兴地宣布 Rust 新版本 1.53.0 发布。Rust 是一种旨在赋能所有人的编程语言,助您构建可靠且高效的软件。
如果您之前通过 rustup 安装了 Rust,那么升级到 Rust 1.53.0 非常简单,只需运行:
$ rustup update stable
如果您还没有安装 Rust,您可以从我们的网站上的相应页面获取 rustup
,并查看 GitHub 上1.53.0 版本的详细发布说明。
1.53.0 稳定版的新特性
此版本包含几个新的语言特性和许多新的库特性,包括期待已久的数组 IntoIterator
实现。请参阅详细发布说明,了解本文未涵盖的其他更改。
数组的 IntoIterator
这是 Rust 首个数组实现了 IntoIterator
trait 的版本。这意味着您现在可以通过值来迭代数组:
for i in [1, 2, 3] {
..
}
以前,这只能通过引用来实现,使用 &[1, 2, 3]
或 [1, 2, 3].iter()
。
同样地,您现在可以将数组传递给期望 T: IntoIterator
的方法:
let set = BTreeSet::from_iter([1, 2, 3]);
for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) {
..
}
由于向后兼容性问题,这在以前没有实现。因为 IntoIterator
已经为数组的引用实现了,array.into_iter()
在早期版本中已经可以编译,解析为 (&array).into_iter()
。
从此版本开始,数组实现了 IntoIterator
,并使用了一个小的变通方法来避免破坏现有代码。编译器将继续将 array.into_iter()
解析为 (&array).into_iter()
,就好像 trait 实现不存在一样。这仅适用于 .into_iter()
方法调用语法,不影响任何其他语法,例如 for e in [1, 2, 3]
,iter.zip([1, 2, 3])
或 IntoIterator::into_iter([1, 2, 3])
,这些都可以正常编译。
由于 .into_iter()
的这个特殊情况仅是为了避免破坏现有代码而需要的,因此它将在今年晚些时候发布的新版本 Rust 2021 中移除。有关更多信息,请参阅版本公告。
或模式
模式语法已扩展为支持在模式中任何位置嵌套 |
。这使您可以编写 Some(1 | 2)
而不是 Some(1) | Some(2)
。
match result {
Ok(Some(1 | 2)) => { .. }
Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
_ => { .. }
}
Unicode 标识符
标识符现在可以包含非 ASCII 字符。现在可以使用 Unicode 中定义的所有有效标识符字符,如 UAX #31 中所定义的那样。这包括来自许多不同脚本和语言的字符,但不包括 emoji。
例如:
const BLÅHAJ: &str = "🦈";
struct 人 {
名字: String,
}
let α = 1;
编译器将警告可能涉及不同脚本的混淆情况。例如,使用看起来非常相似的标识符将导致警告。
warning: identifier pair considered confusable between `s` and `s`
Cargo 中 HEAD 分支名称支持
Cargo 不再假定 git 仓库的默认 HEAD
分支名为 master
。这意味着对于默认分支名为 main
的仓库,您不再需要为 git 依赖项指定 branch = "main"
。
增量编译默认保持关闭
正如之前在 1.52.1 版本的博客文章中讨论的那样,增量编译已在 Rust 稳定发布通道中默认关闭。该功能在 beta 和 nightly 发布通道中仍然可用。对于 1.53.0 稳定版,重新启用增量编译的方法与 1.52.1 版本相同。
稳定的 API
以下方法和 trait 实现已稳定化。
array::from_ref
array::from_mut
AtomicBool::fetch_update
AtomicPtr::fetch_update
BTreeSet::retain
BTreeMap::retain
BufReader::seek_relative
cmp::min_by
cmp::min_by_key
cmp::max_by
cmp::max_by_key
DebugStruct::finish_non_exhaustive
Duration::ZERO
Duration::MAX
Duration::is_zero
Duration::saturating_add
Duration::saturating_sub
Duration::saturating_mul
f32::is_subnormal
f64::is_subnormal
数组的 IntoIterator
{integer}::BITS
io::Error::Unsupported
NonZero*::leading_zeros
NonZero*::trailing_zeros
Option::insert
Ordering::is_eq
Ordering::is_ne
Ordering::is_lt
Ordering::is_gt
Ordering::is_le
Ordering::is_ge
OsStr::make_ascii_lowercase
OsStr::make_ascii_uppercase
OsStr::to_ascii_lowercase
OsStr::to_ascii_uppercase
OsStr::is_ascii
OsStr::eq_ignore_ascii_case
Peekable::peek_mut
Rc::increment_strong_count
Rc::decrement_strong_count
slice::IterMut::as_slice
AsRef<[T]> for slice::IterMut
impl SliceIndex for (Bound<usize>, Bound<usize>)
Vec::extend_from_within
其他更改
Rust 1.53.0 版本还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改。
1.53.0 版本贡献者
许多人齐心协力创建了 Rust 1.53.0。没有你们大家,我们不可能做到。感谢!