Rust 团队发布了 Rust 的新版本 1.59.0。 Rust 是一种编程语言,它使每个人都能够构建可靠和高效的软件。
Rust版本升级,可通过以下命令将rust升级到最新的1.59.0版本:
rustup update stable
1.59.0稳定版介绍
内联汇编(Inline assembly)
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);
内联汇编可用的汇编语言和指令因目标体系结构而异。今天,稳定的 Rust 编译器支持以下架构上的内联汇编:
- x86 and x86-64
- ARM
- AArch64
- RISC-V
解构赋值(Destructuring assignments)
现在可以在赋值语句左侧使用为元组、切片和struct赋值
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 泛型默认值和interleaving(Const generics defaults and interleaving)
泛型类型现在可以为其 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 {
// ...
}
未来不兼容警告(Future incompatibility warnings)
现在,当未来版本的 Rust 拒绝依赖项时,Cargo 会向您显示警告。运行 cargo build 或 cargo check 后,您可能会看到:
warning: the following packages contain code that will be rejected by a future version of Rust: old_dep v0.1.0
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
您可以运行警告中提到的 cargo report 命令来查看将被拒绝的代码的完整报告。这使您有时间在依赖项破坏您的构建之前升级它。
创建剥离的二进制文件(Creating stripped binaries)
从您分发的二进制文件中去除不必要的信息(如调试信息)通常很有用,使它们更小。
虽然可以在创建二进制文件后手动执行此操作,但 cargo 和 rustc 现在支持在链接二进制文件时进行剥离。要启用此功能,请将以下内容添加到您的 Cargo.toml:
[profile.release]
strip = "debuginfo"
这会将 debuginfo 从发布二进制文件中删除。您还可以提供“symbols”或仅提供 true 以在版本支持的情况下去除所有符号信息。
标准库通常附带详细的调试信息,因此在未启用调试符号的情况下构建的 Rust 二进制文件仍默认包含来自标准库的调试信息。使用 strip 选项可以删除这些额外信息,生成更小的 Rust 二进制文件。
增量编译默认关闭
1.59.0 版本默认禁用增量(除非通过环境变量明确要求:RUSTC_FORCE_INCREMENTAL=1)。这减轻了已知错误 #94124 的影响,该错误可能会在打开增量编译的编译期间导致反序列化错误(和panics)。
#94124 的具体修复程序已经登陆,目前处于 1.60 测试版中,将在六周内发布。如果没有出现问题,1.60 稳定版很可能会再次启用增量编译。
稳定的API
现在稳定了以下方法和trait实现:
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
implementingClone
,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
以下以前稳定的函数现在是 const
:
mem::MaybeUninit::as_ptr
mem::MaybeUninit::assume_init
mem::MaybeUninit::assume_init_ref
ffi::CStr::from_bytes_with_nul_unchecked
其他更新
Rust 1.59.0 版本中还有其他更改。查看 Rust, Cargo, 和 Clippy.的变化。
1.59.0 的贡献者
许多人聚集在一起创建了 Rust 1.59.0。没有你们,我们不可能做到。 Thanks!