2018-12-13 | 研究与探索 | UNLOCK

Rust2018

Rust2018终于出了(尽管再有十来天2018就结束了(而且我似乎火星了)),还有了超赞的NLL!之前有传闻说官方没有加进去NLL的计划,真有点惊喜呢。

升级到1.31后,用cargo新建crate时自动会在package项下添加edition = "2018"并应用rust2018的新标准;但是cargo在处理没有editon选项的crate时会视作2015版的代码,这应该是为了确保兼容性,就像g++5.4虽然支持C++11,但默认标准是C++98。

对日常编写代码而言,rust2018和之前的版本并没有很大差别,但是主要有两点需要注意。

模块和crate引入

rust2018中不再需要在代码中使用extern crate来引入crate,只要你在Cargo.toml中添加了相应的dependencies项,就能在package中自由使用它,就像使用std或者core时不需要extern crate一样。

而且rust2018使用了更友好的模块组织方式:模块a_module中的代码放在a_module.rs中,它的子模块则放在a_module文件夹下,二者可以同时存在,不再需要a_module/mod.rs!(但是这个语法保留了下来)

但是在使用use语句导入名字时增加了限制,后面的声明必须以self,super,crate(作为关键字)或一个可用的crate名称开始,其中self和super像以前一样是用作相对位置的,crate关键字则代表当前crate。

举个例子吧,同一目录下有m.rs与main.rs,m.rs中有公开(pub)函数foo,以往可以直接在main.rs中写

1
2
mod m;
use m::foo;

但是现在你必须写:

1
2
mod m; 
use self::m::foo;

或者当main.rs是二进制crate的主文件时写use crate::m::foo。否则会报错。

应该是为了更加严谨吧。

try关键字

rust2018增加了try关键字,但是似乎还没有具体用途,就像override。难道他们想实现一个try-catch式的错误处理系统?这可和rust风格不太搭……或许只是为了避免误用吧。

由此try!宏被取消了,只能使用?语法糖了。

———- 2019.08.11 增注 ———-

try关键字应该是为了try语法块,就像下面这样:

1
2
3
4
5
let result : Result<i32,io::Error> = try {
let mut bytes = [0u8;512];
file_hdl.read(&mut bytes)?;
calc(pre_calc(&bytes)?)
};

原来的try!宏其实还可以用,只是必须写成r#try!