宣布 Rust 1.20

2017 年 8 月 31 日 · Rust 核心团队

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

如果您已安装了先前版本的 Rust,获取 Rust 1.20 非常简单

$ rustup update stable

如果您还没有,您可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上的1.20.0 的详细发布说明

1.20.0 稳定版中的内容

在之前的 Rust 版本中,您已经可以定义具有“关联函数”的特征、结构体和枚举。

struct Struct;

impl Struct {
    fn foo() {
        println!("foo is an associated function of Struct");
    }
}

fn main() {
    Struct::foo();
}

它们被称为“关联函数”,因为它们是与类型关联的函数,也就是说,它们附加到类型本身,而不是任何特定实例。

Rust 1.20 添加了定义“关联常量”的功能。

struct Struct;

impl Struct {
    const ID: u32 = 0;
}

fn main() {
    println!("the ID of Struct is: {}", Struct::ID);
}

也就是说,常量 IDStruct 相关联。与函数一样,关联常量也适用于特征和枚举。

特征在关联常量方面具有额外的功能,赋予它们一些额外的能力。使用特征时,您可以像使用关联类型一样使用关联常量:通过声明它,但不赋予它值。然后,特征的实现者在实现时声明其值。

trait Trait {
    const ID: u32;
}

struct Struct;

impl Trait for Struct {
    const ID: u32 = 5;
}

fn main() {
    println!("{}", Struct::ID);
}

在此版本之前,如果您想创建一个表示浮点数的特征,您需要编写以下代码。

trait Float {
    fn nan() -> Self;
    fn infinity() -> Self;
    ...
}

这有点笨拙,但更重要的是,因为它们是函数,所以它们不能在常量表达式中使用,即使它们只返回常量。因此,Float 的设计也必须包含常量。

mod f32 {
    const NAN: f32 = 0.0f32 / 0.0f32;
    const INFINITY: f32 = 1.0f32 / 0.0f32;

    impl Float for f32 {
        fn nan() -> Self {
            f32::NAN
        }
        fn infinity() -> Self {
            f32::INFINITY
        }
    }
}

关联常量让您可以用更简洁的方式做到这一点。这个特征定义

trait Float {
    const NAN: Self;
    const INFINITY: Self;
    ...
}

导致了这个实现

mod f32 {
    impl Float for f32 {
        const NAN: f32 = 0.0f32 / 0.0f32;
        const INFINITY: f32 = 1.0f32 / 0.0f32;
    }
}

更简洁,更通用。

关联常量是在RFC 195中提出的,几乎正好三年前。这个特性已经存在相当长一段时间了!该 RFC 包含所有关联项,而不仅仅是常量,因此其中一些,例如关联类型,比其他一些实现得更快。总的来说,我们一直在进行大量的内部工作来进行常量评估,以提高 Rust 在编译时元编程方面的能力。预计未来在这方面会有更多进展。

我们还修复了文档测试中 include! 宏的一个错误:对于相对路径,它错误地相对于工作目录,而不是相对于当前文件。

查看详细的发布说明以了解更多信息。

库稳定化

这个版本中库方面没有什么特别令人兴奋的东西,只是一些可靠的改进和对 API 的持续稳定化。

unimplemented!现在接受消息,让您可以说明为什么某些东西尚未实现。

我们升级到 Unicode 10.0.0

浮点类型上的 minmax用 Rust 重写,不再依赖于 cmath

我们在这个版本中发布了针对堆栈冲突的缓解措施,特别是堆栈探测,以及在 Linux 上跳过主线程的手动堆栈保护。您无需执行任何操作即可获得这些保护,只需使用 Rust 1.20 即可。

我们在标准库中添加了三个新的排序函数:slice::sort_unstable_by_keyslice::sort_unstable_byslice::sort_unstable。您会注意到这些函数的名称中都包含“unstable”。稳定性是排序算法的一个属性,您可能需要或不需要它,但现在您有了两种选择!以下是简要总结:假设我们有一个这样的单词列表

rust
crate
package
cargo

其中两个词 cargocrate 都以字母 c 开头。仅根据第一个字母进行排序的稳定排序必须产生以下结果

crate
cargo
package
rust

也就是说,因为 crate 在原始列表中位于 cargo 之前,所以它在最终列表中也必须位于 cargo 之前。不稳定排序可以提供该结果,但也可以给出以下答案

cargo
crate
package
rust

也就是说,结果可能与原始顺序不同。

正如您可能想象的那样,约束越少,结果通常越快。如果您不关心稳定性,这些排序可能比稳定排序更快。和往常一样,最好检查两者并进行比较!这些函数是通过RFC 1884添加的,如果您想了解更多详细信息,包括基准测试,请查看该 RFC。

此外,以下 API 也已稳定化

查看详细的发布说明以了解更多信息。

Cargo 特性

Cargo 在这个版本中有一些不错的升级。首先,您的 crates.io 身份验证令牌以前存储在 ~/.cargo/config 中。作为配置文件,它通常以 644 权限存储,也就是说,对所有人可读。但它包含一个秘密令牌。我们已将令牌移至 ~/.cargo/credentials,以便它可以以 600 权限进行许可,并对系统上的其他用户隐藏。

如果您在 Cargo 包中使用辅助二进制文件,您知道它们保存在 src/bin 中。但是,有时您希望多个辅助二进制文件具有重要的逻辑;在这种情况下,您将拥有 src/bin/client.rssrc/bin/server.rs,并且这两个文件的任何子模块都将位于同一个目录中。这很混乱。相反,我们现在通常支持 src/bin/client/main.rssrc/bin/server/main.rs,以便您可以将较大的二进制文件彼此分开。

查看详细的发布说明以了解更多信息。

1.20.0 的贡献者

许多人共同创建了 Rust 1.20。没有你们,我们无法做到。感谢!