Rust 1.15 发布公告

2017年2月2日 · Rust 核心团队

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

如果您已安装了 Rust 的早期版本,则只需执行以下操作即可获取 Rust 1.15:

$ rustup update stable

如果您还没有安装 Rust,您可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上1.15.0 的详细发行说明。此版本共提交了 1443 个补丁。

1.15.0 稳定版中的新特性

Rust 1.15 带来了一个非常令人期待的功能:自定义派生!回顾一下,在 Rust 中,您始终可以通过 derive 属性自动实现一些 trait:

#[derive(Debug)]
struct Pet {
    name: String,
}

然后为 Pet 实现了 Debug trait,大大减少了样板代码。但是,这仅适用于标准库中提供的 trait;它不可自定义。在 Rust 1.15 中,它现在可以自定义了。这意味着,如果您想将您的 Pet 转换为 JSON,只需将 Serde 添加到您的 Cargo.toml 中即可:

[dependencies]
serde = "0.9"
serde_derive = "0.9"
serde_json = "0.9"

并将另一个 trait 添加到您的 Pet 中:

#[macro_use]
extern crate serde_derive;

extern crate serde_json;

#[derive(Serialize, Deserialize, Debug)]
struct Pet {
    name: String,
}

fn main() {
    let pet = Pet { name: String::from("Ferris") };

    let serialized = serde_json::to_string(&pet).unwrap();
    println!("serialized = {}", serialized);

    let deserialized: Pet = serde_json::from_str(&serialized).unwrap();
    println!("deserialized = {:?}", deserialized);
}

这将输出:

serialized = {"name":"Ferris"}
deserialized = Pet { name: "Ferris" }

另一个常见的用例是 Diesel。假设我们有一个 Pet 的数据库。我们可以像这样获取它们:

// some extern crate and use lines elided here

#[derive(Queryable)]
struct Pet {
    name: String,
}

fn main() {
    use diesel_demo::schema::pets::dsl::*;

    let connection = establish_connection();
    let results = pets
        .limit(5)
        .load::<Pet>(&connection)
        .expect("Error loading pets");

    println!("Displaying {} pets", results.len());
    for pet in results {
        println!("{}", pet.name);
    }
}

有关完整说明,请参阅 该网站

这类库功能非常强大,但依赖于自定义派生来实现人体工程学。虽然这些库以前在 Rust 稳定版上可以工作,但它们的使用体验并不好,以至于我们经常听到用户说“我只使用 nightly 版本,因为需要 Serde 和 Diesel。”自定义派生是使用最广泛的仅在 nightly 版本中可用的功能之一。因此,为了支持此用例,去年 7 月提出了 RFC 1681。该 RFC 在 8 月合并,经过大量开发和测试,现在终于在今天发布了稳定版!

要了解如何编写自己的自定义派生,请参阅《Rust 程序设计语言》的章节

虽然我们在此处多次提到了“Serde 和 Diesel”,但您可以通过自定义派生做很多其他很酷的事情:例如,请参阅 derive-new。有关更多信息,请参阅 syn crate 的反向依赖项。(syn 对于编写自定义派生非常重要,有关详细信息,请参阅上面链接的书籍章节。) 自定义派生也称为“宏 1.1”,因为它包括支持 Rust 更强大的编译时功能的框架,这些功能被昵称为“宏 2.0”。预计在未来的版本中会听到更多关于这方面的信息。

其他改进

Rust 的构建系统 已使用 Cargo 以 Rust 重新编写。现在它是默认的。这个过程很漫长,但终于取得了成果。鉴于所有 Rust 开发都在主分支上进行,我们自去年 12 月以来一直在使用它,并且它运行良好。有一个开放的 PR 用于完全删除 Makefile,将在 Rust 1.17 中发布。这将为 rustc 在编译器中像任何其他 Rust 项目一样使用来自 crates.io 的包铺平道路,并且进一步证明了 Cargo 的成熟度。

Rust 已为 i686-unknown-openbsdMSP430ARMv5TE 获得了 Tier 3 支持

许多编译器性能改进已发布。我们正在继续努力使编译器更快。期望在未来看到更多改进!

作为一个较小的改进,?Sized 现在可以在 where 子句中使用。换句话说:

struct Foo<T: ?Sized> {
    f: T,
}

struct Foo<T> where T: ?Sized {
    f: T,
}

现在接受第二种形式,并且它等效于第一种形式。

有关更多信息,请参阅详细发行说明

库稳定化

slice::sort 算法已重写,并且速度快得多、得多。它是一种混合归并排序,借鉴了 Timsort 的影响。以前它是一个直接的归并排序。

如果您有一个 Vec<T>,其中 T: Copy,并且您对其调用了 extend,那么您的代码现在将快得多

说到速度变快,chars().count()chars().last()char_indices().last() 也是如此!

现在,中文字符可以在 fmt::Debug 中正确显示。.

还有许多函数已稳定化:

有关更多信息,请参阅详细发行说明

Cargo 功能

如果您的包的顶层有一个名为 build.rs 的文件,但没有 build = "build.rs" 注释,Cargo 现在会发出警告。这是为了预期推断顶层的 build.rs 始终是一个构建脚本,但目前出于兼容性原因,这是一个警告。以前,所有构建脚本都需要配置,但此约定在社区中很强大,因此我们将把它编码到 Cargo 中。

在此版本中,Cargo 构建脚本不再能够通过 env!("OUT_DIR") 在构建时访问 OUT_DIR 环境变量。它们应该改为在运行时使用 std::env 检查该变量。该值在构建时设置是一个错误,并且在交叉编译时是不正确的。请检查您的包正在执行的操作并更新为使用 std::env

cargo test 命令增加了--all 标志的支持,这在您有一个工作区时非常有用。

现在,我们在 Windows 上静态编译 MSVC CRT,并在 Mac OS X 上静态链接 OpenSSL

有关更多信息,请参阅详细发行说明

1.15.0 的贡献者

在发布公告的这一部分中,我们通常会发布贡献者列表。但是,我们最近启动了一个新的倡议“Thanks!”,以更全面的方式来做到这一点。此部分的一个问题是,它只计算对 rust-lang/rust 存储库的贡献;例如,对 Cargo 做出贡献的人没有被感谢。我们还必须手动生成此列表,这并不算太糟糕,但是运行正确的 git 命令来确定谁做出了贡献正是代码擅长的!

因此,您现在可以访问 https://thanks.rust-lang.org/ 来查看更全面的贡献计算。如果您愿意,我们还有一个别名,位于 https://❤.rust-lang.org。目前,这将只显示我们在以前的发布帖子中显示的内容。我们确实有一个附加功能,这是一个按提交计数排序的历来贡献列表。它位于此处:https://thanks.rust-lang.org/rust/all-time

我们已经完成了一些必要的后端工作,以启用比 rust-lang/rust 更多的存储库,但这尚未完全完成。如果您想参与其中,请查看 GitHub 上的 thanks

共有 137 位个人为 Rust 1.15 做出了贡献。 谢谢!