2311rust,到50版本更新

1.46.0稳定版

改进const fn

现在,可在const fn中使用几个核心语言功能:

1,if,ifletmatch

2,while,whileletloop

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_subsaturating_mul方法.

3,所有有符号整数checked_abs,saturating_abs,saturating_negsignum.

4,charu8is_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_whitespaceis_ascii_control方法.

1.48.0稳定版

rustdoc中更容易链接

RustdocRust发布版中包含的库文档工具,可让你用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;
}

一切正常,但如果可链接其他类型,就太好了.这样可更容易在文档间访问.

问题是MarkdownRustrustdoc生成的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显示为链接文本.更多

添加搜索别名

现在,可通过rustdocUI搜索时,在项目上指定#[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稳定版

64ARMLinux达到第1层

Rust编译器支持各种目标,但Rust团队无法为所有这些目标提供相同级别支持.为了清楚标记支持程度,使用分层系统:

编译器在技术上支持第3层目标,但不会检查其代码是否生成或通过测试,且发布时不提供预构建二进制文件.
第2层目标可保证构建,且提供预构建的二进制文件,但不会在这些平台上执行测试包:生成的二进制文件可能无法工作或有错误.
第1层目标提供最高支持保证.
Rust1.49.0提升aarch64-unknown-linux-gnu目标为第1层支持,为运行Linux64ARM系统的用户带来最高保证!

这一变化使从嵌入式到台式机和服务器的工作负载受益.

这是该项目一个重要里程碑,因为这是非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
相关推荐
SomeB1oody1 天前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
SomeB1oody2 天前
【Rust自学】4.2. 所有权规则、内存与分配
开发语言·后端·rust
SomeB1oody2 天前
【Rust自学】4.5. 切片(Slice)
开发语言·后端·rust
编码浪子2 天前
构建一个rust生产应用读书笔记6-拒绝无效订阅者02
开发语言·后端·rust
baiyu332 天前
1小时放弃Rust(1): Hello-World
rust
baiyu332 天前
1小时放弃Rust(2): 两数之和
rust
Source.Liu2 天前
数据特性库 前言
rust·cad·num-traits
编码浪子2 天前
构建一个rust生产应用读书笔记7-确认邮件1
数据库·rust·php
SomeB1oody2 天前
【Rust自学】3.6. 控制流:循环
开发语言·后端·rust
Andrew_Ryan2 天前
深入了解 Rust 核心开发团队:这些人如何塑造了世界上最安全的编程语言
rust