Rust 1.59.0发布


Rust 团队发布了 Rust 的新版本 1.59.0。Rust 是一种编程语言,它使每个人都能够构建可靠和高效的软件。
 
内联装配
Rust 语言现在支持内联汇编。这使得许多应用程序需要对其执行进行非常低级别的控制,或访问专门的机器指令。
例如,在为 x86-64 目标编译时,您现在可以编写:

use std::arch::asm;

// Multiply x by 6 using shifts and adds
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);

asm!用于在和global_asm! 宏中命名寄存器的格式字符串语法与 Rust格式字符串中使用的相同,因此对于 Rust 程序员来说应该很熟悉。
内联汇编可用的汇编语言和指令因目标体系结构而异。今天,稳定的 Rust 编译器支持以下架构上的内联汇编:

  • x86 and x86-64
  • ARM
  • AArch64
  • RISC-V

 
解构分配
您现在可以使用元组、切片和结构模式作为赋值的左侧。
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]);

 
const 泛型默认值和交错
泛型类型现在可以为其 const 泛型指定默认值。例如,您现在可以编写以下内容:

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],
        }
    }
}

以前,类型参数必须位于所有 const 参数之前。该限制已放宽,您现在可以交错使用它们。

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
{
    // ...
}

 
未来的不兼容警告
有时,Rust 编译器中的错误会导致它接受不应该被接受的代码。现在,当未来版本的 Rust 拒绝依赖项时,Cargo 会向您显示警告。
 
创建剥离的二进制文件
从您分发的二进制文件中去除不必要的信息(如调试信息)通常很有用,使它们更小。
 
增量编译默认关闭
1.59.0 版本默认禁用增量(除非通过环境变量明确要求:)