Rust 团队很高兴地宣布 Rust 的最新版本 1.9 发布。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
与往常一样,您可以从我们网站上的相应页面安装 Rust 1.9,并在 GitHub 上查看1.9 的详细发布说明。此版本中大约有 1000 个补丁被合并。
1.9 稳定版中的新功能
受控展开
Rust 1.9 中最大的变化是 `std::panic` 模块的稳定化,其中包括用于停止 panic 启动的展开过程的方法。
use std::panic;
let result = panic::catch_unwind(|| {
println!("hello!");
});
assert!(result.is_ok());
let result = panic::catch_unwind(|| {
panic!("oh no!");
});
assert!(result.is_err());
这个新的 API 在 RFC 1236 中定义。
一般来说,Rust 区分了操作失败的两种方式
- 由于预期问题,例如找不到文件。
- 由于意外问题,例如数组的索引超出范围。
预期问题通常来自您无法控制的条件;健壮的代码应该为环境可能抛出的任何情况做好准备。在 Rust 中,预期问题通过 `Result` 类型处理,该类型允许函数将其问题的信息返回给调用者,然后调用者可以以细粒度的方式处理错误。
意外问题是错误:它们是由于违反了契约或断言而引起的。由于它们是意外的,因此以细粒度的方式处理它们是没有意义的。相反,Rust 采用“快速失败”方法,即panic,默认情况下会展开发现错误的线程的堆栈(运行析构函数,但不运行其他代码)。其他线程继续运行,但只要它们尝试与发生 panic 的线程通信(无论是通过通道还是共享内存),就会发现 panic。因此,panic 会中止执行到某个“隔离边界”,边界另一侧的代码仍然可以运行,并且可能会以非常粗粒度的方式从 panic 中“恢复”。例如,服务器不一定需要仅仅因为它其中一个线程中的断言失败而关闭。
新的 `catch_unwind` API 提供了一种在线程内引入新的隔离边界的方法。有几个关键的动机示例
- 在其他语言中嵌入 Rust
- 管理线程的抽象
对于第一种情况,跨语言边界展开是未定义的行为,并且在实践中经常导致段错误。允许捕获 panic 意味着您可以安全地通过 C API 公开 Rust 代码,并将展开转换为 C 端的错误。
对于第二种情况,请考虑一个线程池库。如果池中的线程发生 panic,通常您不希望杀死线程本身,而是捕获 panic 并将其传递给池的客户端。`catch_unwind` API 与 `resume_unwind` 配对,后者可用于在池的客户端上重新启动 panic 过程,这才是它应该存在的地方。
在这两种情况下,您都在线程内引入新的隔离边界,然后将 panic 转换为其他地方的其他形式的错误。
最后一点:为什么是 `catch_unwind` 而不是 `catch_panic`?我们正在添加一种额外的 panic 策略:中止整个进程(可能在运行通用的hook之后)。对于某些应用程序,这是处理程序员错误的最合理方法,并且避免展开可以提高性能并减小代码大小。
弃用警告
我们为库作者引入了一个新的属性:`#[deprecated]`。此属性允许您使用弃用警告标记 API,他们的 crate 的用户每当使用该 API 时都会收到该警告,并将其定向到替换 API。弃用警告长期以来一直是标准库的一部分,但由于 RFC 1270,它们现在可以在整个生态系统中使用。
新目标
我们现在为几个新目标发布标准库二进制文件
mips-unknown-linux-musl
,mipsel-unknown-linux-musl
和i586-pc-windows-msvc
.
从交叉编译的角度来看,前两个目标特别有趣;有关更多详细信息,请参阅最近关于 `rustup` 的博客文章。
编译时改进
在类型统一期间比较变量是否等效的时间复杂度从 O(n!) 降低到 O(n)。因此,某些编程模式的编译速度要快得多。
推出专业化的使用
此版本首次在标准库中使用专业化。专业化目前仅在 nightly 版本中可用,它允许根据更具体的类型信息自动专业化通用代码。
标准库中出现这种情况的一个示例:从字符串切片 (&str
) 转换为拥有的 String
。一种方法 `to_string` 来自以前相对较慢的通用 API,而自定义的 `to_owned` 实现提供了更好的性能。使用专业化,这两个函数现在是等效的。
在我们掌握了这个简单的专业化测试后,我们将在即将发布的版本中推出更多性能改进。
库稳定化
大约 80 个库函数和方法现在在 1.9 中是稳定的。最主要的是前面描述的 `std::panic` 模块,但还有更多
网络
TcpStream
、TcpListener
和UdpSocket
获得了一些用于配置连接的方法。SocketAddr
及其变体获得了set_ip()
和set_port()
的便利方法。
集合
BTreeSet
和HashSet
获得了take()
、replace()
和get()
方法,这些方法可以恢复原始键的所有权。OsString
获得了一些方法,使其更接近于String
的奇偶校验。- 切片获得了
copy_from_slice()
,这是一种安全的memcpy
形式。
编码
char
获得了解码为 UTF-16 的能力。
指针
- 原始指针获得了
as_ref()
和as_mut()
,它们返回一个Option<&T>
,将空指针转换为None
。 ptr::{read,write}_volatile()
允许从原始指针进行易失性读取和写入。
最后,libcore
中的许多类型不包含 Debug
实现。此问题已在 1.9 版本中修复。
有关更多信息,请参阅详细的发布说明。
Cargo 功能
Cargo 有两个主要更改
首先,Cargo 现在可以并发运行。
其次,添加了一个新的标志 `RUSTFLAGS`,was added。此标志允许您指定要通过环境变量传递给 `rustc` 的任意标志,例如,这对于打包程序很有用。
有关更多信息,请参阅详细的发布说明。
1.9 的贡献者
我们有 127 位个人为 1.9 做出了贡献。非常感谢你们!
- Aaron Turon
- Abhishek Chanda
- Adolfo Ochagavía
- Aidan Hobson Sayers
- Alan Somers
- Alejandro Wainzinger
- Aleksey Kladov
- Alex Burka
- Alex Crichton
- Amanieu d'Antras
- Andrea Canciani
- Andreas Linz
- Andrew Cantino
- Andrew Horton
- Andrew Paseltiner
- Andrey Cherkashin
- Angus Lees
- Ariel Ben-Yehuda
- Benjamin Herr
- Björn Steinbrink
- Brian Anderson
- Brian Bowman
- Christian Wesselhoeft
- Christopher Serr
- Corey Farwell
- Craig M. Brandenburg
- Cyryl Płotnicki-Chudyk
- Daniel J Rollins
- Dave Huseby
- David AO Lozano
- David Henningsson
- Devon Hollowood
- Dirk Gadsden
- Doug Goldstein
- Eduard Burtescu
- Eduard-Mihai Burtescu
- Eli Friedman
- Emanuel Czirai
- Erick Tryzelaar
- Evan
- Felix S. Klock II
- Florian Berger
- Geoff Catlin
- Guillaume Gomez
- Gökhan Karabulut
- JP Sugarbroad
- James Miller
- Jeffrey Seyfried
- John Talling
- Jonas Schievink
- Jonathan S
- Jorge Aparicio
- Joshua Holmer
- Kai Noda
- Kamal Marhubi
- Katze
- Kevin Brothaler
- Kevin Butler
- Manish Goregaokar
- Markus Westerlind
- Marvin Löbel
- Masood Malekghassemi
- Matt Brubeck
- Michael Huynh
- Michael Neumann
- Michael Woerister
- Ms2ger
- NODA, Kai
- Nathan Kleyn
- Nick Cameron
- Niko Matsakis
- Noah
- Novotnik, Petr
- Oliver Middleton
- Oliver Schneider
- Philipp Oppermann
- Piotr Czarnecki
- Pyfisch
- Richo Healey
- Ruud van Asseldonk
- Scott Olson
- Sean McArthur
- Sebastian Wicki
- Seo Sanghyeon
- Simon Sapin
- Simonas Kazlauskas
- Steve Klabnik
- Steven Allen
- Steven Fackler
- Stu Black
- Sébastien Marie
- Tang Chenglong
- Ted Horst
- Ticki
- Tim Montague
- Tim Neumann
- Timon Van Overveldt
- Tobias Bucher
- Tobias Müller
- Todd Lucas
- Tom Tromey
- Tshepang Lekhonkhobe
- Ulrik Sverdrup
- Vadim Petrochenkov
- Valentin Lorentz
- Varun Vats
- Wang Xuerui
- Wangshan Lu
- York Xiang
- arcnmx
- ashleysommer
- bors
- ggomez
- gohyda
- ituxbag
- mitaa
- nicholasf
- petevine
- pierzchalski
- pravic
- srinivasreddy
- tiehuis
- ubsan
- vagrant
- vegai
- vlastachu
- Валерий Лашманов