• 2311rust,到50版本更新


    1.46.0稳定版

    改进const fn

    现在,可在const fn中使用几个核心语言功能:
    1,if,ifletmatch
    2,while,whileletloop
    3,&&||符号
    4,还可转换切片:

    const fn foo() {
      let x = [1, 2, 3, 4, 5];
      //转换`数组`为切片
      let y: &[_] = &x;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    虽然这些功能并不新鲜,但可在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"),
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    现在像这样:

    #[track_caller]
    pub fn unwrap(self) -> T {
        同上...
    }
    
    • 1
    • 2
    • 3
    • 4

    就是这样!
    如果自己实现恐慌(panic)勾挂,则可用std::panic::Location上的调用者方法来访问此信息.

    更改库

    std::mem::forget现在是const fn.此外,此版本还稳定了两个新API:

    Option::zip
    vec::Drain::as_slice
    
    • 1
    • 2

    1.47.0稳定版

    大数组上的特征

    Rust目前无法在整数值上泛型.
    因为无法泛型N,所以必须要为每个N的数组手动实现特征.
    如果试在Rust1.46上:

    fn main() {
        let xs = [0; 34];
        println!("{:?}", xs);
    }
    
    • 1
    • 2
    • 3
    • 4

    会收到错误.
    但在Rust1.47中,它会打印出正确的数组.

    更短的追踪

    Rust1.47.0中,已修复.该程序:

    fn main() {
        panic!();
    }
    
    • 1
    • 2
    • 3

    更容易地看到恐慌实际起源,如果想看到所有内容,你仍可设置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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    以下以前稳定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代码编写一些文档,如下:

    pub mod foo {
        pub struct Foo;
    }
    pub mod bar {
        pub struct Bar;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    两个模块,每个模块内部都有个结构.但想同时使用这两个结构;要在文档中记录这一点.因此,如下编写一些文档:

    pub mod foo {
        /// `Foo`文档
        ///
        pub struct Foo;
    }
    
    pub mod bar {
        /// `Bar`文档
        ///
        pub struct Bar;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    一切正常,但如果可链接其他类型,就太好了.这样可更容易在文档间访问.
    问题是MarkdownRustrustdoc生成的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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第一例生成Bar类型的正确链接.第二个链接到Foo,但会将整个crate::foo::Foo显示为链接文本.更多

    添加搜索别名

    现在,可通过rustdocUI搜索时,在项目上指定#[doc(alias="")],以添加搜索别名.这是一个较小的更改,但仍有用.像这样:

    #[doc(alias = "bar")]
    struct Foo;
    
    • 1
    • 2

    有了该注解,如果在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");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    此外,此版本还稳定了五个新API:

    slice::as_ptr_range
    slice::as_mut_ptr_range
    VecDeque::make_contiguous
    future::pending
    future::ready
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以下以前稳定的API现已成为常量:

    Option::is_some
    Option::is_none
    Option::as_ref
    Result::is_ok
    Result::is_err
    Result::as_ref
    Ordering::reverse
    Ordering::then
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.49.0稳定版

    64ARMLinux达到第1层

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

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

    这一变化使从嵌入式到台式机和服务器的工作负载受益.
    这是该项目一个重要里程碑,因为这是非x86目标首次达到第1层支持.
    注意,Android不受此更改影响,因为它使用不同的第2层目标.

    测试框架抓线程中的输出

    Rust内置测试框架没有太多功能,这里改进了!

    #[test]
    fn thready_pass() {
        println!("fee");
        std::thread::spawn(|| {
            println!("fie");
            println!("foe");
        })
        .join()
        .unwrap();
        println!("fum");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试运行程序确保抓输出,并在测试失败时保存它.

    更改库

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    Python 海龟绘图基础教学教案(九)
    【JVM技术专题】精心准备了一套JVM分析工具的锦囊「JConsole补充篇」
    xss之DOM破坏
    c语言从入门到实战——C语言数据类型和变量
    一文读懂TDengine的三种查询功能
    5G技术的飞速发展:连接未来
    探索未来,开启无限可能:打造智慧应用,亚马逊云科技大语言模型助您一臂之力
    Salesforce ServiceCloud考证学习(4)
    Vue3 + Vite + Ts + Router搭建项目
    【ESP 保姆级教程】疯狂Node.js服务器篇 ——本地部署MQTT服务器以及剖析MQTT过程
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/134484698