• 2311rust,到60版本更新


    1.54.0稳定版

    属性可调用类似函数的宏

    Rust1.54支持在属性中调用类似函数的宏.类似函数的宏是像基于macro_rules!宏一样调用的或像macro!(...)一样的过程宏.

    注意,常见用例是,在Rust文档注解中包含其他文件中的文档.如,如果项目的README代表了一个很好的文档注释,则可用include_str!直接整合内容.

    #![doc = include_str!("README.md")]
    
    • 1

    也可在属性中嵌套宏.如,可用用stringify!来包括替换的concat!宏来构建文档注释:

    macro_rules! make_function {
        ($name:ident, $value:expr) => {
            #[doc = concat!("The `", stringify!($name), "` example.")]
            /// #示例
            ///```
            #[doc = concat!(
                "assert_eq!(", module_path!(), "::", stringify!($name), "(), ",
                stringify!($value), ");")
            ]
            ///
            pub fn $name() -> i32 {
                $value
            }
        };
    }
    make_function! {func_name, 123}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    更多.

    稳定WASM32内部函数

    已稳定wasm32平台的许多允许访问WebAssembly中的SIMD指令的内部函数.

    即可按完全安全的函数公开一些内部函数,如v128_bitselect.但是,仍有一些内部函数不安全的,因为它们使用原始指针,如v128_load.

    默认,重新启用增量编译

    稳定的API

    已稳定以下方法和特征实现.

    BTreeMap::into_keys
    BTreeMap::into_values
    HashMap::into_keys
    HashMap::into_values
    arch::wasm32
    VecDeque::binary_search
    VecDeque::binary_search_by
    VecDeque::binary_search_by_key
    VecDeque::partition_point
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.55.0稳定版

    Cargo删除重复数据编译器错误

    过去版本中,运行cargo test,cargo check --all-targets或类似的命令时,在多个配置中构建了相同的Rust仓库,因为是并行运行rustc,可能会重复显示相同的错误和警告.

    如,在1.54.0中,此输出很常见:

    $ cargo +1.54.0 check --all-targets
        Checking foo v0.1.0
    warning: function is never used: `foo`
     --> src/lib.rs:9:4
      |
    9 | fn foo() {}
      |    ^^^
      |
      = note: `#[warn(dead_code)]` on by default
    warning: 1 warning emitted
    warning: function is never used: `foo`
     --> src/lib.rs:9:4
      |
    9 | fn foo() {}
      |    ^^^
      |
      = note: `#[warn(dead_code)]` on by default
    warning: 1 warning emitted
        Finished dev [unoptimized + debuginfo] target(s) in 0.10s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.55中,已调整为在编译结束删除重复数据再打印报告:

    $ cargo +1.55.0 check --all-targets
        Checking foo v0.1.0
    warning: function is never used: `foo`
     --> src/lib.rs:9:4
      |
    9 | fn foo() {}
      |    ^^^
      |
      = note: `#[warn(dead_code)]` on by default
    warning: `foo` (lib) generated 1 warning
    warning: `foo` (lib test) generated 1 warning (1 duplicate)
        Finished dev [unoptimized + debuginfo] target(s) in 0.84s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    更快,更正确的浮点解析

    已更新标准库的浮点解析实现为提高速度和正确性Eisel-Lemire算法,细节.

    已更新std::io::ErrorKind变体

    std::io::ErrorKind是一个可分类错误为如NotFoundWouldBlock等可移植分类的#[non_exhaustive]枚举.

    std::io::ErrorRust代码可调用kind方法来取std::io::ErrorKind,并匹配该方法以处理指定错误.
    并非所有错误都归类为ErrorKind值;在以前的Rust版本中,未分类的错误ErrorKind::Other;分类.
    但是,用户创建的std::io::Error值也常用ErrorKind::Other.

    1.55中,未分类的错误,现在使用内部变体ErrorKind::Uncategorized,并打算隐藏它,且不能用稳定的Rust代码命名;

    这让ErrorKind::Other专门构造非标准库的std::io::Error值.这强制ErrorKind#[non_exhaustive]本质.

    Rust代码永远不应与ErrorKind::Other匹配,并期望特定的底层错误码;仅当抓使用该错误类型的已构造std::io::Error时,才匹配ErrorKind::Other.
    匹配std::io::ErrorRust代码应总是用_来表示未知错误类型,此时,可匹配底层错误码,或报告错误,或冒泡到调用代码.

    此更改确保未知代码匹配变体,必须使用既适合ErrorKind::Uncategorized,也适合将来仅限nightly-only的变体的_抓所有模式.

    添加了开区间模式

    Rust1.55稳定了模式使用开区间:

    match x as u32 {
          0 => println!("zero!"),
          1.. => println!("正数"),
    }
    
    • 1
    • 2
    • 3
    • 4

    细节.

    稳定API

    已稳定以下方法和特征实现.

    Bound::cloned
    Drain::as_str
    IntoInnerError::into_error
    IntoInnerError::into_parts
    MaybeUninit::assume_init_mut
    MaybeUninit::assume_init_ref
    MaybeUninit::write
    array::map
    ops::ControlFlow
    x86::_bittest
    x86::_bittestandcomplement
    x86::_bittestandreset
    x86::_bittestandset
    x86_64::_bittest64
    x86_64::_bittestandcomplement64
    x86_64::_bittestandreset64
    x86_64::_bittestandset64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    以下以前稳定的函数现在是.

    str::from_utf8_unchecked
    
    • 1

    1.57.0稳定版

    在常环境中用恐慌!

    以前版本Rust,在const fn和其他编译时环境中不可用恐慌!宏.现在,已稳定下来.从而,其他几个标准库API现在都可在中使用,比如assert!.

    现在必须用:

    panic!("...")
    //静态串
    //或与{}搭配用的&str插值
    panic!("{}", a)
    
    • 1
    • 2
    • 3
    • 4

    该最小的稳定已支持直接编译时断定,如验证类型的大小:

    const _: () = assert!(std::mem::size_of::<u64>() == 8);
    const _: () = assert!(std::mem::size_of::<u8>() == 1);
    
    • 1
    • 2

    Cargo自定义配置文件

    Cargo长期以来,一直支持四种配置文件:dev,release,testbench.在Rust1.57中,支持任意命名配置文件.

    如,如果只想在最终生产版本时,启用(LTO)链接时优化,则在选择此配置文件时,添加以下代码片Cargo.toml会启用lto标志,但避免普通发布版本启用它.

    [profile.production]
    inherits = "release"
    lto = true
    
    • 1
    • 2
    • 3

    注意,自定义配置文件必须要继承的默认设置配置文件.定义配置文件后,构建时,可加上:

    --profile production
    
    • 1

    目前,在单独的目录(在本例中为target/production)中构建,而不会在目录间共享.

    易错分配

    Rust1.57稳定了Vec,String,HashMap,HashSetVecDequetry_reserve.
    如果全局分配器失败,Rust一般会中止进程,这并不总是可取的.此API在使用标准库集合时,可避免中止.

    但是,Rust并不保证,由内核分配返回内存:如,如果在Linux上启用了过提交(overcommit),则试使用内存时,可能内存不可用.

    稳定的API

    已稳定以下方法和特征实现.

    [T; N]::as_mut_slice
    [T; N]::as_slice
    collections::TryReserveError
    HashMap::try_reserve
    HashSet::try_reserve
    String::try_reserve
    String::try_reserve_exact
    Vec::try_reserve
    Vec::try_reserve_exact
    VecDeque::try_reserve
    VecDeque::try_reserve_exact
    Iterator::map_while
    iter::MapWhile
    proc_macro::is_available
    Command::get_program
    Command::get_args
    Command::get_envs
    Command::get_current_dir
    CommandArgs
    CommandEnvs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    以前稳定函数现在是.

    hint::unreachable_unchecked
    
    • 1

    1.58.0稳定版

    格式串中抓标识

    格式串,现在只需在中写入{ident}即可抓参数.长期以来格式一直接受位置参数(可选按索引)和命名参数,如:

    println!("Hello, {}!", get_person());                //隐式位置
    println!("Hello, {0}!", get_person());               //显式索引
    println!("Hello, {person}!", person = get_person()); //命名
    
    • 1
    • 2
    • 3

    现在,还可从周围的域命名参数,如:

    let person = get_person();
    //...抓局部的"人"
    println!("Hello, {person}!"); //
    
    • 1
    • 2
    • 3

    也可格式化参数:

    let (width, precision) = get_format();
    for (name, score) in get_scores() {
      println!("{name}: {score:width$.precision$}");
    }
    
    • 1
    • 2
    • 3
    • 4

    格式串只能抓普通标识,而不能抓任意路径或表达式.对更复杂的参数,请先它们给局部名,或使用较旧的name=式风格来设置参数格式.

    化简窗口命令搜索路径

    窗口目标上,std::process::Command不再在当前目录中搜索可执行文件.这是win32CreateProcessAPI的遗留行为,因此Rust以下顺序有效搜索:
    (相关Rust)子级的PATH环境变量中列举的目录(如果从父级显式更改该环境变量).
    1,从加载应用的目录.
    2,父进程的当前目录.
    3,32窗口系统目录.
    4,16窗口系统目录.
    5,窗口目录.
    6,在PATH环境变量中列举的目录.

    窗口Rust新命令搜索顺序为:

    1,子级的PATH环境变量中列举的目录.
    2,从加载应用的目录.
    3,32窗口系统目录.
    4,窗口目录.
    5,在PATH环境变量中列举的目录.

    非窗口目标继续使用其相关平台行为,一般只考虑子或父PATH环境变量.

    标准库中更多#[must_use]

    类型或函数可应用#[must_use]属性,如果不显式考虑它们,输出就会出错.在标准库中,长期以来一直用Result等类型,应检查它们是否存在错误条件.
    类似函数,但比真正语言功能更宽松.

    稳定的API

    Metadata::is_symlink
    Path::is_symlink
    {integer}::saturating_div
    Option::unwrap_unchecked
    Result::unwrap_unchecked
    Result::unwrap_err_unchecked
    File::options
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    常函数

    Duration::new
    Duration::checked_add
    Duration::saturating_add
    Duration::checked_sub
    Duration::saturating_sub
    Duration::checked_mul
    Duration::saturating_mul
    Duration::checked_div
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.58.1稳定版

    Rust1.58.1修复了std::fs::remove_dir_all标准库函数中的竞争.
    修复了Rustfmt中的通过标准输入时阻止格式化生成的文件.
    修复了rustc有时显示的错误信息.

    1.59.0稳定版

    内联汇编

    Rust语言现在支持内联汇编.这样,可执行非常低级控制,或访问专门的机器指令.
    如,针对x86-64目标编译时,现在可编写:

    use std::arch::asm;
    //用`移位和加法`乘6
    let mut x: u64 = 4;
    unsafe {
        asm!(
            "mov {tmp}, {x}",
            "shl {tmp}, 1",
            "shl {x}, 2",
            "add {x}, {tmp}",
            x = inout(reg) x,
            tmp = out(reg) _,
        );
    }
    assert_eq!(x, 4 * 6);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    asm!global_asm!宏中的格式串语法与Rust格式串中使用的相同.
    内联汇编汇编语言和指令目标架构而异.目前,稳定的Rust编译器支持以下架构内联汇编:

    x86 and x86-64
    ARM
    AArch64
    RISC-V
    
    • 1
    • 2
    • 3
    • 4

    更多内联汇编见示例.

    解构赋值

    现在,可用元组,切片和结构模式作为赋值左侧.

    let (a, b, c, d, e);
    (a, b) = (1, 2);
    [c, .., d, _] = [1, 2, 3, 4, 5];
    Struct { e, .. } = Struct { e: 5, f: 3 };
    assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使得赋值let绑定更加一致,注意,禁止使用(如+=)符号解构赋值.

    泛型默认值和交错

    泛型类型,现在可为常量泛型指定默认值.如,现在可编写以下内容:

    struct ArrayStorage<T, const N: usize = 2> {
        arr: [T; N],
    }
    impl<T> ArrayStorage<T> {
        fn new(a: T, b: T) -> ArrayStorage<T> {
            ArrayStorage {
                arr: [a, b],
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    以前,必须在所有参数前指定类型参数.已放宽该限制,现在可交错.

    fn cartesian_product<
        T, const N: usize,
        U, const M: usize,
        V, F
    >(a: [T; N], b: [U; M], f: F) -> [[V; N]; M]
    where
        F: FnMut(&T, &U) -> V
    {
        //...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    创建去掉的二进制文件

    分发的二进制文件中去掉不必要的信息(如debuginfo)来使它们变小,一般很有用.
    虽然,创建二进制文件后总是可手动这样,但cargorustc现在支持在链接二进制文件时去掉.要启用此功能,在Cargo.toml中加上:

    [profile.release]
    strip = "debuginfo"
    
    • 1
    • 2

    更多细节

    稳定的API

    已稳定以下方法和特征实现:

    std::thread::available_parallelism
    Result::copied
    Result::cloned
    arch::asm!
    arch::global_asm!
    ops::ControlFlow::is_break
    ops::ControlFlow::is_continue
    TryFrom<char> for u8
    char::TryFromCharError implementing Clone, Debug, Display, PartialEq, Copy, Eq, Error
    iter::zip
    NonZeroU8::is_power_of_two
    NonZeroU16::is_power_of_two
    NonZeroU32::is_power_of_two
    NonZeroU64::is_power_of_two
    NonZeroU128::is_power_of_two
    DoubleEndedIterator for ToLowercase
    DoubleEndedIterator for ToUppercase
    TryFrom<&mut [T]> for [T; N]
    UnwindSafe for Once
    RefUnwindSafe for Once
    armv8 neon intrinsics for aarch64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    以下稳定函数现在是:

    mem::MaybeUninit::as_ptr
    mem::MaybeUninit::assume_init
    mem::MaybeUninit::assume_init_ref
    ffi::CStr::from_bytes_with_nul_unchecked
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    生成多元正态数据
    C语言题目逻辑实战总结
    Linux CentOS 8(磁盘的挂载与卸载)
    GC垃圾回收器详解
    打开MySQL数据库
    ubuntu18.04 OAK-D kalibr 双目+imu联合标定
    基于ssm的公选课申报系统
    载羟基喜树碱-聚乳酸纳米粒|平均粒径为85nm的葫芦素BE聚乳酸纳米微粒(CuBE- PLA-NP)技术资料
    Blender全流程制作!全网百万点赞的中传动画专业学生毕设作品《象群挽歌》主创专访...
    职场中的“显眼包”却是领导的心头宝!
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/134490632