1.46.0稳定版
改进const fn
现在,可在const fn中使用几个核心语言功能:
1,if,iflet和match
2,while,whilelet和loop
3,&&和||符号
4,还可转换为切片:
cpp
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:
cpp
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
}
}
现在像这样:
cpp
#[track_caller]
pub fn unwrap(self) -> T {
同上...
}
就是这样!
如果自己实现恐慌(panic)勾挂,则可用std::panic::Location上的调用者方法来访问此信息.
更改库
std::mem::forget现在是const fn.此外,此版本还稳定了两个新API:
cpp
Option::zip
vec::Drain::as_slice
1.47.0稳定版
大数组上的特征
Rust目前无法在整数值上泛型.
因为无法泛型N,所以必须要为每个N的数组手动实现特征.
如果试在Rust1.46上:
cpp
fn main() {
let xs = [0; 34];
println!("{:?}", xs);
}
会收到错误.
但在Rust1.47中,它会打印出正确的数组.
更短的追踪
在Rust1.47.0中,已修复.该程序:
cpp
fn main() {
panic!();
}
可更容易地看到恐慌实际起源,如果想看到所有内容,你仍可设置RUST_BACKTRACE=full.
窗口上的控制流防护
rustc现在支持-C control-flow-guard,该选项在窗口上,打开控制流这里保护.其他平台忽略此标志.
更改库
此外,此版本还稳定了9个新API:
cpp
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代码编写一些文档,如下:
cpp
pub mod foo {
pub struct Foo;
}
pub mod bar {
pub struct Bar;
}
有两个模块,每个模块内部都有个结构.但想同时使用这两个结构;要在文档中记录这一点.因此,如下编写一些文档:
cpp
pub mod foo {
/// `Foo`文档
///
pub struct Foo;
}
pub mod bar {
/// `Bar`文档
///
pub struct Bar;
}
一切正常,但如果可链接到其他类型,就太好了.这样可更容易在文档间访问.
问题是Markdown对Rust和rustdoc生成的URL一无所知.因此,Rust必须手写.
该版本中,可用一些语法让rustdoc知道你正在试链接到一个类型,让它为你生成URL.下面是基于之前代码的两个不同示例:
cpp
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="<alias>")],以添加搜索别名.这是一个较小的更改,但仍有用.像这样:
cpp
#[doc(alias = "bar")]
struct Foo;
有了该注解,如果在rustdoc的搜索中搜索"bar",即使搜索文本中没有"Foo",也会把Foo当作结果的一部分而出现.
别名还用在,每个Rust函数都可别名到它所包装的C函数的FFI包装仓库.然后,底层C库的现有用户可轻松搜索正确的Rust函数!
更改库
最重要的API更改类似:[T;N]:TryFrom<Vec<T>>现在是稳定的.可用它来试把向量变成定长数组:
cpp
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:
cpp
slice::as_ptr_range
slice::as_mut_ptr_range
VecDeque::make_contiguous
future::pending
future::ready
以下以前稳定的API现已成为常量:
cpp
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的内置测试框架没有太多功能,这里改进了!
cpp
#[test]
fn thready_pass() {
println!("fee");
std::thread::spawn(|| {
println!("fie");
println!("foe");
})
.join()
.unwrap();
println!("fum");
}
测试运行程序确保抓输出,并在测试失败时保存它.
更改库
在Rust1.49.0中,有三个新的稳定函数:
cpp
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