宣布 Rust 1.25

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

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

如果你已经通过 rustup 安装了 Rust 的先前版本,获取 Rust 1.25.0 就像这样简单

$ rustup update stable

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

1.25.0 stable 版本中有哪些内容

最近几个版本改动相对较小,但 Rust 1.25 包含了许多内容!第一个是显而易见的:我们已经从 LLVM 4 升级到 LLVM 6。这带来了一些影响,其中主要一点是离 AVR 支持更近了一步。

一种新的 use 语句写法已经落地:嵌套导入组。如果你曾经写过这样一组导入语句

use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};

你现在可以这样写

// on one line
use std::{fs::File, io::Read, path::{Path, PathBuf}};

// with some more breathing room
use std::{
    fs::File,
    io::Read,
    path::{
        Path,
        PathBuf
    }
};

这可以减少一些重复,并使内容更清晰一些。

此版本中有两个重要的文档更新:首先,Rust By Example 现在包含在 doc.rust-lang.org 上!我们很快会将旧域名重定向到这里。我们希望这能让这个出色的资源获得更多关注,并且你会在本地文档中获得一份本地副本。

其次,回顾 Rust 1.23,我们讨论了从 Hoedown 到 pulldown-cmark 的改变。在 Rust 1.25 中,pulldown-cmark 现在是默认设置。我们终于从 rustdoc 中移除了最后一点 C 代码,并且现在正确遵循 CommonMark 规范。

最后,在 RFC 1358 中,#[repr(align(x))] 被接受了。在 Rust 1.25 中,它现在已经稳定!这个属性允许你设置你的 structs 的 对齐方式

struct Number(i32);

assert_eq!(std::mem::align_of::<Number>(), 4);
assert_eq!(std::mem::size_of::<Number>(), 4);

#[repr(align(16))]
struct Align16(i32);

assert_eq!(std::mem::align_of::<Align16>(), 16);
assert_eq!(std::mem::size_of::<Align16>(), 16);

如果你正在进行底层工作,控制这些东西可能非常重要!

更多信息请参阅详细发布说明

库稳定化

这个版本中库方面最大的亮点是 std::ptr::NonNull<T>。这个类型类似于 *mut T,但它是非空的且是协变的。这篇博客文章不是解释协变的合适地方,但简而言之,NonNull<T> 保证它不会是 null,这意味着 Option<NonNull<T>>*mut T 大小相同。如果你正在使用 unsafe 代码构建数据结构,NonNull<T> 通常是适合你的类型!

libcore 获得了 time 模块,其中包含了之前仅在 libstd 中可用的 Duration 类型。

此外,与 Duration 关联的 from_secsfrom_millis 函数被设置为 const fn,允许它们被用作常量表达式来创建 Duration

更多信息请参阅详细发布说明

Cargo 特性

Cargo 的 CLI 在这个版本中有一个非常重要的改变:cargo new 现在默认为生成二进制文件,而不是库。我们努力保持 Cargo 的 CLI 相当稳定,但这个改变很重要,并且不太可能造成破坏。

作为背景介绍,cargo new 接受两个标志:--lib 用于创建库,以及 --bin 用于创建二进制文件或可执行文件。如果你不传递其中任何一个标志,在 Cargo 的先前版本中,它会默认为 --lib。我们做出这个决定是因为每个二进制文件(通常)依赖于许多库,所以库的情况更常见。然而,这是不正确的;每个库都 许多二进制文件 依赖。此外,在入门时,你通常想要的是一个可以运行和试玩的程序。不仅仅是 Rust 新手如此;即使是非常资深的社区成员也表示他们觉得这个默认设置令人惊讶。因此,我们正在改变它。

类似地,cargo new 以前在创建包的名称方面有些“主观意见”。具体来说,如果你的包名以 rust- 开头或以 -rs 结尾,Cargo 会重命名它。其意图是,既然它是 Rust 包,这些信息就显得冗余。然而,人们对命名非常看重,当他们遇到这种情况时,会感到惊讶并常常不高兴。因此,我们不再这样做

许多用户喜欢 cargo doc,它是一种为 Cargo 项目生成本地文档的方式。在本次发布中,它获得了巨大的速度提升,因为它现在使用 cargo check 而不是完整的 cargo build,因此某些场景会变得更快。

此外,由于尽可能使用了硬链接,git 依赖的检出 应该会快很多

更多信息请参阅详细发布说明

1.25.0 的贡献者

许多人共同努力创造了 Rust 1.25。没有大家,这一切都不可能实现。

谢谢!