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 | mod m; |
但是现在你必须写:
1 | mod m; |
或者当main.rs是二进制crate的主文件时写use crate::m::foo
。否则会报错。
应该是为了更加严谨吧。
try关键字
rust2018增加了try
关键字,但是似乎还没有具体用途,就像override
。难道他们想实现一个try-catch式的错误处理系统?这可和rust风格不太搭……或许只是为了避免误用吧。
由此try!
宏被取消了,只能使用?
语法糖了。
———- 2019.08.11 增注 ———-
try
关键字应该是为了try
语法块,就像下面这样:
1 | let result : Result<i32,io::Error> = try { |
原来的try!
宏其实还可以用,只是必须写成r#try!
。