Rust 团队很高兴宣布 Rust 的新版本 1.53.0。Rust 是一种编程语言,它赋予每个人构建可靠且高效软件的能力。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.53.0 就像
$ rustup update stable
如果您还没有,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上的1.53.0 的详细发布说明。
1.53.0 稳定版中的内容
此版本包含几个新的语言特性和许多新的库特性,包括期待已久的数组的 IntoIterator
实现。查看详细的发布说明,了解本文未涵盖的其他更改。
数组的 IntoIterator
这是第一个 Rust 版本,其中数组实现了 IntoIterator
特性。这意味着您现在可以通过值迭代数组
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()
,就好像该特性实现不存在一样。这仅适用于 .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 字符。现在可以使用 UAX #31 中定义的所有有效的 Unicode 标识符字符。这包括来自许多不同脚本和语言的字符,但不包括表情符号。
例如
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
以下方法和特性实现已稳定。
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
slice::IterMut 的 AsRef<[T]>
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。没有你们,我们无法做到。 谢谢!