发布 Rust 1.26.1

2018 年 5 月 29 日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的新版本 1.26.1。Rust 是一种系统编程语言,专注于安全、速度和并发。

如果您之前通过 rustup 安装了 Rust,获取 Rust 1.26.1 非常简单,只需运行

$ rustup update stable

如果您尚未安装 rustup,可以从我们网站上相应的页面获取 rustup,并在 GitHub 上查看1.26.1 的详细发行说明

1.26.1 stable 版本包含了什么?

在 1.26.0 中发现了一些问题,这些问题足以发布一个补丁版本。

改动快速摘要

  • RLS 不再干扰命令行构建
  • Rustfmt 停止在某些情况下错误地格式化文本
  • 从 main 函数通过 impl Trait 返回时,如果 Trait 不是 Termination,则不再被允许
  • ::<> (turbofish) 不再适用于类型为 impl Trait 的方法参数
  • NaN > NaN 在 const 上下文中不再返回 true
  • rustup 不应再因某些平台上缺少文档而失败

如果您的代码仍然可以编译,则只有浮点比较的改变可能会影响行为。

RLS 不再干扰命令行构建

1.26.0 版本附带的 RLS 使用了与命令行 Cargo 相同的目标目录,这意味着在两者之间切换会导致所有内容被重新编译。对于 Windows 用户来说,这个问题更加严重,因为 RLS 或编译器未释放文件系统锁,导致错误率增加。后一个 bug 尚未修复,但随着第一个 bug 的修复,它的发生频率已大大降低。

Rustfmt 错误格式化问题

之前,rustfmt 会过度缩进多行字符串字面量,现在此问题已修复。

从 main 函数通过 impl Trait 返回时,如果 Trait 不是 Termination,不再有效

之前,我们只检查了底层类型是否实现了 Termination trait。现在,在 stable 版本中只能返回具体类型,因为除了 impl Termination 外,其他都无效,但该 trait 目前不稳定,无法导入。

例如,以下代码在 1.26.1 中将不再有效

fn main() -> impl Copy {}

但这仍然有效,因为它不试图通过 impl Trait 返回任何隐藏类型,而是明确指定了类型。

fn main() -> Result<(), std::io::Error> {
    Ok(())
}

Turbofish 不再适用于带有 impl Trait 的方法参数

之前,我们意外地允许代码指定使用 impl Trait 的方法参数的类型。在 1.26.0 中,下面的代码会起作用,但 turbofish (下面的 ::<u32>) 应该如何与 impl Trait 交互尚未确定,因此我们阻止了 turbofish 的使用,直到我们能确定语义符合我们的预期。

struct Foo;

impl Foo {
    fn bar(&self, _arg: impl Copy) {}
}

fn main() {
    Foo.bar::<u32>(0);
}

const 上下文中的浮点比较已改变

之前,在 const 上下文中将 NaN 与其他浮点数进行大于比较会返回 true,这是一个 bug;现在,此比较返回 false。在某些情况下,这可能意味着代码的行为会改变,但我们预计这种情况相对较少。

use std::f64::NAN;
const FOO: bool = ::std::f64::NAN >= ::std::f64::NAN;
// On 1.26.0
assert_eq!(FOO, true);
// On 1.26.1
assert_eq!(FOO, false);

rustup 现在应该可以在缺少文档的平台上安装 stable 版本

在 1.26 的开发周期中,我们更改了构建标准库文档的方式,导致我们停止为许多 tier 2 平台生成文档组件。这导致在这些平台上运行 rustup update 时出现问题,因为 rustup 拒绝部分安装 Rust。有些用户需要运行 rustup install stable 而不是 rustup update 来让 rustup 避免缺少文档组件,但这应该是一次性的问题。

不幸的是,此问题修复得太晚,未能进入 1.26 stable 版本,因此我们在 1.26.1 中添加了此补丁,以便用户能够在这些平台上安装 Rust。

$ rustup update
info: syncing channel updates for 'stable-x86_64-unknown-freebsd'
info: latest update on 2018-05-10, rust version 1.26.0 (a77568041 2018-05-07)
error: component 'rust-docs' for 'x86_64-unknown-freebsd' is unavailable for download