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 策略:中止整个进程(可能是在运行一个通用的钩子之后)。对于某些应用程序,这是处理程序员错误的最合理方式,避免展开可以带来性能和代码大小方面的优势。
弃用警告
我们为库作者引入了一个新的属性:#[deprecated]
。此属性允许您为 API 添加弃用警告,当用户使用该 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,该 API 以前相对较慢,而自定义 to_owned
实现提供了更好的性能。使用特化,这两个函数现在等效。
有了对特化的简单测试,我们将在即将发布的版本中带来更多性能改进。
库稳定化
1.9 中大约有 80 个库函数和方法现在是稳定的。最主要的是前面描述的 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
。 此标志允许您通过环境变量指定要传递给 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
- Валерий Лашманов