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
这是第一个数组实现了IntoIterator 特质的Rust版本。这意味着你现在可以按值迭代数组了:
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中所有有效的标识符现在都可以使用。 这包括许多不同脚本和语言的字符,但不包括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发布通道上已经默认关闭。该功能在测试版和夜间发布通道上仍然可用。对于1.53.0稳定版,重新启用增量的方法与1.52.1相比没有变化。
稳定的API
以下方法和特性的实现被稳定化:
array::from_refarray::from_mutAtomicBool::fetch_updateAtomicPtr::fetch_updateBTreeSet::retainBTreeMap::retainBufReader::seek_relativecmp::min_bycmp::min_by_keycmp::max_bycmp::max_by_keyDebugStruct::finish_non_exhaustiveDuration::ZERODuration::MAXDuration::is_zeroDuration::saturating_addDuration::saturating_subDuration::saturating_mulf32::is_subnormalf64::is_subnormalIntoIterator for array{integer}::BITSio::Error::UnsupportedNonZero*::leading_zerosNonZero*::trailing_zerosOption::insertOrdering::is_eqOrdering::is_neOrdering::is_ltOrdering::is_gtOrdering::is_leOrdering::is_geOsStr::make_ascii_lowercaseOsStr::make_ascii_uppercaseOsStr::to_ascii_lowercaseOsStr::to_ascii_uppercaseOsStr::is_asciiOsStr::eq_ignore_ascii_casePeekable::peek_mutRc::increment_strong_countRc::decrement_strong_countslice::IterMut::as_sliceAsRef<[T]> for slice::IterMutimpl SliceIndex for (Bound<usize>, Bound<usize>)Vec::extend_from_within
其他变化
Rust 1.53.0版本中还有其他变化:请查看Rust、Cargo和Clippy中的变化。
1.53.0的贡献者
许多人共同创造了Rust 1.53.0,没有你们,我们不可能做到这一点。谢谢你们