2311rust,1.31版本更新
1.31.0
稳定版
Rust1.31
可能是最激动人心
的版本!
使用Cargo
创建一个新项目:
cargo new foo
以下是Cargo.toml
的内容:
[package]
name = "foo"
version = "0.1.0"
authors = ["名字"]
edition = "2018"
//版本.
[dependencies]
在[package]:edition
下添加了一个新键.注意,已设置为2018
年.如果键不存在,则设置它为2015
默认值.
用Rust2018
,可解锁一些Rust2015
中禁止的新功能
.
注意,每个包都可2015
或2018
模式,它们可无缝地协同工作.2018
项目可用2015
依赖项,2015
项目可用2018
依赖项.
确保
不会分裂生态系统
,且所有这些新事物
都是选入
的,从而确保兼容.此外,迁移Rust2015
代码到Rust2018
时,可通过cargo fix
自动更改.
借用
检查器更聪明,现在接受
一些以前拒绝
的有效代码.
请看该例:
fn main() {
let mut x = 5;
let y = &x;
let z = &mut x;
}
如果确实使用了y
,如:
fn main() {
let mut x = 5;
let y = &x;
let z = &mut x;
println!("y: {}", y);
}
在Rust2018
中,该错误更好了:
error[E0502]
:因为已按不变
借用,无法按可变
借用"x"
并显示借用冲突
的位置.
简化模块系统
1,几乎不再需要extern crate
.
2,可用use
而不是#[macro_use]
属性导入
宏.
3,绝对路径以crate
名开头,而crate
关键字表示当前crate
.
4,foo.rs
和foo/
子目录可共存
;在子目录
中放置子模块
时不再需要mod.rs
.
省略生命期规则
为impl
块和函数定义
添加了一些额外省略规则
.代码如下:
impl<'a> Reader for BufReader<'a> {
//方法在此
}
现在可这样写:
impl Reader for BufReader<'_> {
//方法在此
}
'_
生命期仍显示BufReader
接受参数,但不再需要为它创建名字.
仍要在结构中定义生命期
.但是,不再需要像以前那么多的样板
:
//`2015`
struct Ref<'a, T: 'a> {
field: &'a T
}
//`2018`
struct Ref<'a, T> {
field: &'a T
}
'a
是推导出来的.
常FN
在Rust
中定义函数有几种方法:带有fn
的普通函数
,带不安全fn
的不安全(unsafe fn)
函数,带extern fn
的外部函数.
再添加1个限定函数
的新方法:const fn
.它像这样:
const fn foo(x: i32) -> i32 {
x + 1
}
可像普通函数
一样调用const fn
,但也可在常环境
中使用.如果是,则在编译时
而不是运行时
求值.如:
const SIX: i32 = foo(5);
这在编译时执行foo
,并设置SIX
为6
.
const fn
必须要有确定性输出
,你可以:
1,整数的算术
和比较
符号
2,除&&
和||
之外的所有布尔
符号
3,构造数组,结构,枚举和元组
4,调用其他常fn
5,数组和切片
上的索引式
6,字段访问结构和元组
7,从常
中读取(但不是静态
,甚至不引用静态)
8,引用&和*
9,转换,但转换整数
的原始指针
除外
新工具
在2018
版中,为所有用户准备了新一代工具:Clippy,Rustfmt
和IDE
支持.
Rust
的linter
,clippy
现在可在稳定的Rust
上使用.
rustup component add clippy
//安装
cargo clippy
//运行.
Clippy
现在是1.0
,它有与rustc
相同的lint
稳定性保证.可添加新的lint
,且可修改lint
以添加更多功能,但可能永远不会删除(仅弃用)lint
.
Rustfmt
用来格式化Rust
代码.自动
格式化代码可让你使用官方的Rust
风格.
rustup component add rustfmt
//安装
cargo fmt
//使用.
检查工具
在Rust1.30
中,稳定了如#[rustfmt::skip]
等"工具属性".在Rust1.31
中,稳定了一些检查工具,
比如为lint
提供了名字空间
,以便知道来源的:
#[allow(clippy::bool_comparison)]
如果以前用过Clippy
的lints
,可这样迁移:
//旧
#![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))]
//新功能
#![allow(clippy::bool_comparison)]
不再需要cfg_attr
了!
库稳定
添加了一堆From
实现:
1,u8
现在实现From<NonZeroU8>
,对其他
数值类型及其NonZero
等效项也同样.
2,Option<&T>
实现From<&Option<T>>
,也实现了&mut
此外,这些功能已稳定下来:
1,slice::align_to
及其可变
版
2,slice::chunks_exact
,及可变
版和所有组合
中的r
版本(如slice::rchunks_exact_mut
)
货物
Cargo
现在使用HTTP/2
并行下载包.
此外,现在不必extern crate
,
extern crate foo as baz;
这样,重命名仓库很麻烦.因此,可在Cargo.toml
中这样,如下:
[dependencies]
baz = { version = "0.1", package = "foo" }
//依赖.
[dependencies.baz]
version = "0.1"
package = "foo"
现在,可在代码中通过baz
使用foo
包.