1.46.0
稳定版const fn
现在,可在const fn
中使用几个核心语言功能
:
1,if,iflet
和match
2,while,whilelet
和loop
3,&&
和||
符号
4,还可转换
为切片
:
const fn foo() {
let x = [1, 2, 3, 4, 5];
//转换`数组`为切片
let y: &[_] = &x;
}
虽然这些功能并不新鲜
,但可在const fn
之外使用它们,增加了大量
编译时计算能力!如,const-sha1
仓库可让你编译时
计算SHA-1
哈希值.
这导致微软
的RustWinRT
绑定性能提高了40
倍.
#[track_caller]
该属性叫#[track_caller]
,最初是在2017
年7月的RFC2091
中提出的!如果正在编写一个像unwrap
这样可能会崩溃
的函数,可在函数上加此注解
,默认的panic
格式化会在其错误消息
按位置
使用其调用者.
如,这是先前的unwrap
:
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
}
}
现在像这样:
#[track_caller]
pub fn unwrap(self) -> T {
同上...
}
就是这样!
如果自己实现恐慌(panic)
勾挂,则可用std::panic::Location
上的调用者
方法来访问
此信息.
std::mem::forget
现在是const fn
.此外,此版本还稳定了两个新API
:
Option::zip
vec::Drain::as_slice
1.47.0
稳定版Rust
目前无法在整数值上泛型
.
因为无法泛型N
,所以必须要为每个N
的数组手动实现特征
.
如果试在Rust1.46
上:
fn main() {
let xs = [0; 34];
println!("{:?}", xs);
}
会收到错误.
但在Rust1.47
中,它会打印
出正确的数组.
在Rust1.47.0
中,已修复.该程序:
fn main() {
panic!();
}
可更容易
地看到恐慌
实际起源,如果想看到所有内容,你仍可设置RUST_BACKTRACE=full
.
窗口
上的控制流防护rustc
现在支持-C control-flow-guard
,该选项在窗口
上,打开控制流
这里保护.其他平台忽略
此标志.
此外,此版本还稳定了9个新API
:
Ident::new_raw
Range::is_empty
RangeInclusive::is_empty
Result::as_deref
Result::as_deref_mut
Vec::leak
pointer::offset_from
f32::TAU
f64::TAU
以下以前稳定
的API
现已成为常量
:
1,所有非零(NonZero)
整数的新(new)
方法.
2,所有整数的checked_add,checked_sub,checked_mul,checked_neg,checked_shl,checked_shr,saturating_add,saturating_sub
和saturating_mul
方法.
3,所有有符号整数
的checked_abs,saturating_abs,saturating_neg
和signum
.
4,char
和u8
的is_ascii_alphabetic,is_ascii_uppercase,is_ascii_lowercase,is_ascii_alphanumeric,is_ascii_digit,is_ascii_hexdigit,is_ascii_punctuation,is_ascii_graphic,is_ascii_whitespace
和is_ascii_control
方法.
1.48.0
稳定版rustdoc
中更容易链接Rustdoc
是Rust
发布版中包含的库文档工具
,可让你用Markdown
编写文档.
假设正在为一些Rust
代码编写
一些文档,如下:
pub mod foo {
pub struct Foo;
}
pub mod bar {
pub struct Bar;
}
有两个
模块,每个模块
内部都有个结构
.但想同时使用
这两个结构;要在文档中记录
这一点.因此,如下编写
一些文档:
pub mod foo {
/// `Foo`文档
///
pub struct Foo;
}
pub mod bar {
/// `Bar`文档
///
pub struct Bar;
}
一切正常,但如果可链接
到其他类型
,就太好了.这样可更容易
在文档间访问.
问题是Markdown
对Rust
和rustdoc
生成的URL
一无所知.因此,Rust
必须手写.
该版本中,可用一些
语法让rustdoc
知道你正在试链接
到一个类型
,让它为你生成URL
.下面是基于之前代码的两个不同
示例:
pub mod foo {
/// `Foo`文档及[`Bar`](crate::bar::Bar)
pub struct Foo;
}
pub mod bar {
/// `Bar`文档,及[`crate::foo::Foo`]
pub struct Bar;
}
第一例
生成Bar
类型的正确链接
.第二个
链接到Foo
,但会将整个crate::foo::Foo
显示为链接文本
.更多
现在,可通过rustdoc
的UI
搜索时,在项目上指定#[doc(alias="
,以添加搜索
别名.这是一个较小的更改,但仍有用.像这样:
#[doc(alias = "bar")]
struct Foo;
有了该注解,如果在rustdoc
的搜索中搜索"bar"
,即使搜索文本
中没有"Foo"
,也会把Foo
当作结果的一部分而出现.
别名还用在,每个Rust
函数都可别名
到它所包装的C函数
的FFI
包装仓库.然后,底层C库
的现有用户
可轻松搜索正确的Rust
函数!
最重要的API
更改类似:[T;N]:TryFrom
现在是稳定
的.可用它来试把向量
变成定长
数组:
use std::convert::TryInto;
let v1: Vec<u32> = vec![1, 2, 3];
//这将成功,向量长度为`3`,正在试生成长度为3的数组.
let a1: [u32; 3] = v1.try_into().expect("wrong length");
//但是,如果试使用长度为5的向量来完成......
let v2: Vec<u32> = vec![1, 2, 3, 4, 5];
//...这会恐慌,因为长度错误.
let a2: [u32; 3] = v2.try_into().expect("wrong length");
此外,此版本还稳定了五个新API
:
slice::as_ptr_range
slice::as_mut_ptr_range
VecDeque::make_contiguous
future::pending
future::ready
以下以前稳定的API
现已成为常量
:
Option::is_some
Option::is_none
Option::as_ref
Result::is_ok
Result::is_err
Result::as_ref
Ordering::reverse
Ordering::then
1.49.0
稳定版64
位ARMLinux
达到第1层Rust
编译器支持各种目标
,但Rust
团队无法为所有这些目标
提供相同级别
支持.为了清楚标记支持程度,使用分层系统
:
编译器在技术上支持第3层目标
,但不会检查其代码
是否生成或通过测试,且发布时不提供预构建
的二进制文件
.
第2层
目标可保证构建
,且提供预构建的二进制文件
,但不会在这些平台上执行测试包
:生成的二进制文件
可能无法工作或有错误
.
第1层
目标提供最高
支持保证.
Rust1.49.0
提升aarch64-unknown-linux-gnu
目标为第1层
支持,为运行Linux
的64
位ARM
系统的用户
带来最高保证
!
这一变化使从嵌入式到台式机和服务器
的工作负载受益.
这是该项目
的一个重要里程碑
,因为这是非x86
目标首次达到第1层
支持.
注意,Android
不受此更改影响,因为它使用不同的第2层
目标.
Rust
的内置测试框架
没有太多
功能,这里改进了!
#[test]
fn thready_pass() {
println!("fee");
std::thread::spawn(|| {
println!("fie");
println!("foe");
})
.join()
.unwrap();
println!("fum");
}
测试
运行程序确保抓输出
,并在测试失败
时保存它.
在Rust1.49.0
中,有三个新的稳定
函数:
slice::select_nth_unstable
slice::select_nth_unstable_by
slice::select_nth_unstable_by_key
And two functions were made const:
Poll::is_ready
Poll::is_pending