Rust公布将于今年推出第三版本的计划

Rust基金会发布第三个Rust语言版本Rust 2021的计划,官方预计会在10月的时候发布,该版本会有许多细微的改变,目的是希望能大幅改善Rust的开发体验。

在过去几个月,Rust 2021工作组针对新版本提出了许多建议,现在官方发布了最终清单,这些功能都是满足两项条件才被加入到清单中,第一是该功能必须获得适当的Rust团队核准,第二则是该功能已经有一定的基础,能够按计划在时间内完成。

官方将会改善Rust 2021标准函数库中的Prelude,Prelude是一个模块,其包含了所有模块需要自动导入的内容,例如Option、Vec、drop和Clone等常用的项目,Rust编译器会优先处理手动导入的项目,使其先于Prelude,以确保Prelude中的内容,不会破坏现有的程序代码。

但是官方提到,在Prelude中加入Trait,却可能破坏现有程序代码,像是导入std中的TryInto的同时,使用MyTryInto Trait调用x.try_into就会造成模棱两可的情况,因为具有相同名称而无法编译,这也是官方之所以过去未将TryInto加到Prelude中的原因,因为很多程序代码会因此受到破坏。

在Rust 2021则有了新的解决方案,Rust 2021将使用新的Prelude,除了所有功能会与目前相同之外,还加入了三个新功能,std::convert:: TryInto、std::convert::TryFrom以及std::iter::FromIterator。

而数组的IntoIterator实例方式也将在Rust 2021获得改进,在Rust 1.53前,仅提供参照数组实例IntoIterator的方法,也就是说开发者可以走访&“1, 2 , 3”以及&mut“1, 2, 3”,但是却不能直接走访“1, 2, 3”。官方解释,这是一个长期存在的问题,解决的办法并不简单,直接添加Trait实例会严重破坏现有的程序代码。

有开发者多次建议只在Rust 2021中实例数组IntoIterator,但官方表示,这个做法也完全不可行,因为不能只在一个版本中实例Trait,而另一个版本却没有这个Trait,因为在Rust中,各版本必需要可以混用。

因此官方取而代之的方法,是在Rust 1.53后所有版本实例Trait,并且加入一个小手段来避免Rust 2021之前的程序代码损坏。对Rust 2015和2018程序代码,编译器行为将如同过去一样,会将array.into_iter解析为(&array).into_iter,就像是Trait实例不存在一样,这样的小手段只会用在.into_iter方法调用语法,而不会影响其他语法。

Rust 2021为了要为新语法做准备,因此要把一些前缀识别符号和文本列为保留字,像是prefix#identifier、prefix”string”、prefix’c’以及prefix#123,另外的重大变化,则是宏现在可以接受hello”world”,这将会被视为两个独立的符号hello和“world”,两者中间会自动加入一个空白。其他未来会加入的新前缀包括格式化字符串的简写f“”,效果等同于format_args!,还有以空字符结尾的C字符串,将可以使用c””或是z””。

Rust 2021会成为Rust 1.56.0版本,新功能测试预计将会在9月的时候完成,并且经过6个月的Beta测试后,在10月21日正式发布。

官方解释,之所以Rust需要有主要版本的设计,是为了解决向后不兼容的问题。从Rust 1开始,只要功能上到稳定版本,官方就会在未来所有发布版本中提供支持,但是有时候需要对语言进行一些微小、但是不向后兼容的修改,像是加入新的关键字,这个变更将会使过去使用相同名称的变量失效,而主要版本便是官方用来解决此问题的机制,当官方想要发布向后不兼容的功能时,就会放在新的Rust版本中,供开发者依照需求选择使用Rust的版本。