Rust 团队很高兴地宣布 Rust 的最新版本 1.18.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您已安装 Rust 的先前版本,则获取 Rust 1.18 非常简单,只需运行:
$ rustup update stable
如果您还没有安装,可以从我们网站的相应页面获取 rustup
,并查看 GitHub 上1.18.0 的详细发布说明。
1.18.0 稳定版的新特性
与往常一样,Rust 1.18.0 是一系列改进、清理和新特性的集合。
最大的变化之一是酝酿已久的:核心团队成员 Carol Nichols 和 Steve Klabnik 一直在编写新版的“The Rust Programming Language”,这是关于 Rust 的官方书籍。它正在GitHub 上公开编写,共有 100 多位贡献者。此版本在我们的在线文档中包含了第二版的第一稿。20 章中有 19 章有草稿;第 20 章的草稿将在 Rust 1.19 中发布。本书完成后,将通过No Starch Press提供印刷版,如果您想要纸质版。我们仍在与 No Starch 的编辑合作改进文本,但我们希望现在开始吸引更广泛的受众。
新版本是对旧版本的完全重写,使用了我们过去两年在 Rust 教学中所获得的知识。您会发现对许多 Rust 核心概念的全新解释、要构建的新项目以及各种其他好东西。请查看并告诉我们您的想法!
至于语言本身,一个旧功能学到了一些新技巧:pub
关键字得到了一些扩展。经验丰富的 Rustaceans 将知道,在 Rust 中,默认情况下项目是私有的,您可以使用 pub
关键字使其公开。在 Rust 1.18.0 中,pub
获得了一种新形式
pub(crate) bar;
()
内部的位是“限制”,它细化了如何公开此内容的含义。像上面示例一样使用 crate
关键字意味着 bar
将对整个 crate 公开,但不对其外部公开。这使得声明“对您的 crate 公开”但不暴露给用户的 API 更容易。这在现有的模块系统中是可能的,但通常非常笨拙。
您还可以指定一个路径,例如:
pub(in a::b::c) foo;
这意味着“在 a::b::c
的层次结构中使用,但在其他地方不可用。”此功能在 RFC 1422 中定义,并在参考中进行了文档记录。
对于我们的 Windows 用户,Rust 1.18.0 有一个新的属性 #![windows_subsystem]
。它的工作方式如下:
#![windows_subsystem = "console"]
#![windows_subsystem = "windows"]
这些控制链接器中的 /SUBSYSTEM
标志。目前,仅支持 "console"
和 "windows"
。
这在什么情况下有用?简单来说,如果您正在开发图形应用程序,并且没有指定 "windows"
,则应用程序启动时会闪烁一个控制台窗口。使用此标志,则不会。
最后,Rust 的元组、枚举变体字段和结构体(没有 #[repr]
)始终具有未指定的布局。我们启用了自动重新排序,这可以通过减少填充来减小大小。考虑一个像这样的结构体:
struct Suboptimal(u8, u16, u8);
在以前版本的 x86_64 平台上的 Rust 中,此结构体的大小为六个字节。但是查看源代码,您会期望它有四个字节。多出的两个字节来自填充;鉴于这里有一个 u16
,它应该对齐到两个字节。但在这种情况下,它位于偏移量一处。要将其移动到偏移量二,则在第一个 u8
之后放置另一个字节的填充。为了使整个结构体具有适当的对齐方式,在第二个 u8
之后也添加了一个字节,从而得到 1 + 1 (填充) + 2 + 1 + 1 (填充) = 6 字节
。
但是如果我们的结构体像这样呢?
struct Optimal(u8, u8, u16);
此结构体已正确对齐;u16
位于两个字节的边界上,整个结构体也是如此。不需要填充。这给了我们 1 + 1 + 2 = 4 字节
。
在设计 Rust 时,我们出于这个原因将内存布局的细节留作未定义。因为我们没有提交特定的布局,所以我们可以对其进行改进,例如在这种情况下,编译器可以自动将 Suboptimal
优化为 Optimal
。如果您检查 Rust 1.18.0 中 Suboptimal
和 Optimal
的大小,您会发现它们的大小都为四个字节。
我们已经计划此更改一段时间了;先前版本的 Rust 在 nightly 通道中包含此优化,但有些人编写了不安全的代码,假设表示形式的精确细节。我们在修复了我们所知道的所有此类实例时将其回滚,但是如果您发现由于此原因而导致某些代码中断,请告诉我们,以便我们可以帮助修复!用于 FFI 的结构体可以给出 #[repr(C)]
注释以防止重新排序,以及 C 兼容的字段布局。
我们一直计划将 rustdoc
迁移到使用符合 CommonMark 的 markdown 解析器。但是,仅仅切换可能会引入回归,其中 CommonMark 规范与我们现有的解析器 Hoedown 不同。作为过渡计划的一部分,已向 rustdoc
添加了一个新标志,--enable-commonmark
。这将使用新的解析器而不是旧的解析器。请尝试一下!据我们所知,两个解析器都会产生相同的结果,但是如果您发现渲染结果不同的情况,我们将很感兴趣地知道!
最后,编译 rustc
本身现在速度提高了 15%-20%。此 PR 中的每个提交消息都详细介绍了细节;存在一些效率低下之处,现在已清理完毕。
有关更多信息,请参阅详细的发行说明。
库的稳定化
此版本稳定了七个新的 API
Child::try_wait
是Child::wait
的非阻塞形式。HashMap::retain
和HashSet::retain
将Vec<T>
拥有的retain
API 带到了这两个哈希数据结构。PeekMut::pop
允许您在已经查看过BinaryHeap<T>
的顶部元素后将其弹出,而无需再次重新排序堆。TcpStream::peek
、UdpSocket::peek
、UdpSocket::peek_from
允许您查看流或套接字。
有关更多信息,请参阅详细的发行说明。
Cargo 的特性
Cargo 增加了对 Pijul VCS 的支持,Pijul VCS 是用 Rust 编写的。 cargo new my-awesome-project --vcs=pijul
将让您开始!
为了补充 --all
标志,Cargo 现在有几个新标志,例如 --bins
、--examples
、--tests
和 --benches
,这些标志将允许您构建该类型的所有程序。
最后,Cargo 现在支持 Haiku 和 Android!
有关更多信息,请参阅详细的发行说明。
1.18.0 的贡献者
许多人共同努力创建了 Rust 1.18。没有大家,我们就无法做到这一点。谢谢!