Rust 团队很高兴地宣布新版本 Rust 1.38.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您之前已通过 rustup 安装了 Rust,获取 Rust 1.38.0 就像运行以下命令一样简单:
$ rustup update stable
如果您尚未安装,可以从我们网站上的相应页面 获取 rustup。
1.38.0 稳定版中的内容
此版本的亮点是流水线编译。
流水线编译
要编译一个 crate,编译器不需要其依赖项完全构建完毕。相反,它只需要它们的“元数据”(即类型列表、依赖项、导出项等)。这些元数据在编译过程的早期就产生了。从 Rust 1.38.0 开始,Cargo 将利用这一点,在元数据准备好后立即自动开始构建依赖 crate。
虽然此更改对单个 crate 的构建没有影响,但在测试期间,我们收到了报告,对于某些 crate 图的优化过的干净构建,编译速度提高了 10-20%。其他构建的改进不多,而且速度提升取决于运行构建的硬件,因此您的体验可能会有所不同。无需更改代码即可受益于此改进。
对 mem::{uninitialized, zeroed} 的一些不正确使用方式进行 Lint 检查
如之前宣布的,std::mem::uninitialized 基本上不可能安全使用。应该改用 MaybeUninit<T>。
我们尚未弃用 mem::uninitialized;这将在未来版本中完成。然而,从 1.38.0 开始,rustc 将对使用 mem::uninitialized 或 mem::zeroed 的一小类不正确初始化提供 Lint 检查。
对于某些类型,例如 &T 和 Box<T>,如果它们包含全 0 的位模式,则属于未定义行为,因为它们表示不能为 null 的指针状对象。因此,使用 mem::uninitialized 或 mem::zeroed 初始化这些类型中的任何一个都是错误的,所以新的 Lint 检查将尝试在这些函数被用于初始化其中任何一个时发出警告,无论是直接初始化还是作为较大 struct 的成员进行初始化。此检查是递归的,因此以下代码将发出警告:
;
;
...
let bad_value: CannotBeZero = unsafe ;
细心的读者可能会注意到,Rust 中还有更多不能为零的类型,特别是 NonNull<T> 和 NonZero<T>。目前,使用 mem::uninitialized 或 mem::zeroed 初始化这些 struct 不会触发 Lint 警告。
这些检查并不能涵盖所有不安全使用 mem::uninitialized 或 mem::zeroed 的情况,它们仅仅帮助识别那些明确错误的代码。所有代码仍应改为使用 MaybeUninit。
#[deprecated] 宏
#[deprecated] 属性最早在 Rust 1.9.0 中引入,允许 crate 作者通知其用户其 crate 中的某个项已被弃用,并将在未来版本中移除。Rust 1.38.0 扩展了此属性,允许将其应用于宏。
std::any::type_name
对于调试来说,有时获取类型的名称很有用。例如,在泛型代码中,您可能想在运行时查看函数的类型参数实例化为哪些具体类型。现在可以使用 std::any::type_name 来完成此操作:
这将打印:
Initializing an instance of i32
Initializing an instance of alloc::string::String
与所有仅用于调试的标准库函数一样,字符串的确切内容和格式不作保证。返回值只是对类型的一个尽力而为的描述;多个类型可能共享相同的 type_name 值,并且该值可能在未来的编译器版本中发生变化。
库变更
slice::{concat, connect, join}现在除了接受&T外,也接受&[T]。*const T和*mut T现在实现了marker::Unpin。Arc<[T]>和Rc<[T]>现在实现了FromIterator<T>。iter::{StepBy, Peekable, Take}现在实现了DoubleEndedIterator。
此外,这些函数已稳定化:
<*const T>::cast和<*mut T>::castDuration::as_secs_f32和Duration::as_secs_f64Duration::div_f32和Duration::div_f64Duration::from_secs_f32和Duration::from_secs_f64Duration::mul_f32和Duration::mul_f64- 适用于所有整数原语的欧几里得余数和除法操作 --
div_euclid,rem_euclid。checked、overflowing和wrapping版本也可用。
其他变更
Rust 1.38 版本还有其他变更:查看 Rust、Cargo 和 Clippy 的变更日志。
更正
此帖的先前版本错误地将这些函数标记为稳定。它们尚未稳定:Duration::div_duration_f32 和 Duration::div_duration_f64。
1.38.0 的贡献者
许多人齐心协力创建了 Rust 1.38.0。没有大家的努力,这是不可能完成的。感谢大家!