Rust 1.25 发布

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

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

如果您之前通过 rustup 安装了 Rust,那么获取 Rust 1.25.0 非常简单:

$ rustup update stable

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

1.25.0 稳定版中的新功能

最近的几个版本相对较小,但 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 中,它现在是稳定的! 此属性允许您设置 struct对齐方式

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> 保证它不会为空,这意味着 Option<NonNull<T>>*mut T 的大小相同。 如果您正在使用不安全的代码构建数据结构,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。我们做出此决定的原因是每个二进制文件(通常)依赖于许多库,因此库的情况更为常见。但是,这是不正确的;每个库都 *被* 许多二进制文件 *依赖*。此外,在入门时,您通常想要的是一个可以运行和玩的程序。这不仅是新手 Rustaceans 的问题;即使是很长时间的社区成员也表示,他们发现这个默认设置令人惊讶。 因此,我们正在更改它。

同样,cargo new 以前会对它创建的包的名称有点主观。具体来说,如果您的包以 rust- 开头或以 -rs 结尾,Cargo 将会重命名它。其意图是,嗯,这是一个 Rust 包,此信息是多余的。然而,人们对命名有很强的感觉,当他们遇到这种情况时,他们会感到惊讶并且常常很沮丧。因此,我们不再这样做了

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

此外,由于尽可能使用硬链接,git 依赖项的签出应该会快得多

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

1.25.0 的贡献者

许多人齐心协力创建了 Rust 1.25。 没有你们所有人,我们不可能做到这一点。

感谢!