Rust 团队很高兴地宣布 Rust 的最新版本 1.14.0。Rust 是一种注重安全性、速度和并发性的系统编程语言。
与往常一样,您可以从我们网站上的相应页面安装 Rust 1.14.0,并在 GitHub 上查看1.14.0 的详细发行说明。此版本中包含了 1230 个补丁。
1.14.0 稳定版中的新特性
Rust 1.14 中最大的特性之一实际上不在语言或编译器中:rustup 工具已达到 1.0 版本,现在是直接从项目安装 Rust 的推荐方式。Rustup 的功能不仅仅是安装 Rust
rustup 从官方发布渠道安装 Rust 编程语言,使您能够轻松地在稳定版、beta 版和 nightly 编译器之间切换并保持更新。它通过为常用平台提供标准库的二进制构建,使交叉编译更加简单。它在 Rust 支持的所有平台上运行,包括 Windows。
我们在 5 月份发布了一篇关于 Rustup 的文章。您可以在那里了解更多信息,或在GitHub上查看。
另一个令人兴奋的特性是对 WebAssembly 作为目标的实验性支持,wasm32-unknown-emscripten
。它仍处于早期阶段,并且有很多错误需要解决,所以请尝试并报告它们!为了让您了解它是如何工作的,一旦您安装了emscripten,将一些 Rust 代码编译为 WebAssembly 就很容易了:
$ rustup target add wasm32-unknown-emscripten
$ echo 'fn main() { println!("Hello, Emscripten!"); }' > hello.rs
$ rustc --target=wasm32-unknown-emscripten hello.rs
$ node hello.js
社区在这个领域一直在进行有趣的实验性工作:请参阅 Jan-Erik 的幻灯片,了解他在 Rust Belt Rust 上举办的研讨会的一些示例,或者查看 Tim 的经典 TodoMVC 项目示例。此实现基于他的 webplatform crate,它将 DOM 公开给 Rust。
说到平台,许多平台都获得了额外的支持
对于 rustc
mips-unknown-linux-gnu
mipsel-unknown-linux-gnu
mips64-unknown-linux-gnuabi64
mips64el-unknown-linux-gnuabi64
powerpc-unknown-linux-gnu
powerpc64-unknown-linux-gnu
powerpc64le-unknown-linux-gnu
s390x-unknown-linux-gnu
对于 std
arm-unknown-linux-musleabi
arm-unknown-linux-musleabihf
armv7-unknown-linux-musleabihf
如果您正在使用这些平台之一,请按照网站上的说明进行安装,或使用 rustup target add
将目标添加到现有安装中。
这些平台都是“tier 2”,请参阅我们的 平台支持 页面了解更多详细信息。
就像社区在 WebAssembly 目标上进行有趣的开发一样,在增加 Rust 的目标支持方面也发生了一些很棒的事情,而不仅仅是上面列出的那些。xargo 可以轻松地将 Rust 交叉编译到裸机目标。如果您正在用 Rust 编写操作系统,或者在微控制器上做一些有趣的事情,xargo 可以让您的生活更加简单。
在过去几个版本中 MIR 的落地意味着编译时间方面的一些改进已经落地,未来会有更多改进。
在语言方面,一个小的改进已经落地:支持RFC 1492。这个小小的补充可以让您在更多地方使用 ..
。以前,假设您有一个这样的结构体:
struct Point {
x: i32,
y: i32,
z: i32,
}
在任何您进行模式匹配的上下文中,您都可以使用 ..
来忽略您不关心的部分。例如:
let p = Point { x: 0, y: 1, z: 2 };
match p {
Point { x, .. } => println!("x is {}", x),
}
..
会忽略 y
和 z
。
考虑一个类似的 Point
,但作为一个元组结构体
struct Point(i32, i32, i32);
以前,您可以使用 ..
来忽略所有三个元素
let p = Point(0, 1, 2);
match p {
Point(..) => println!("found a point"),
}
但是您不能使用它来仅忽略元组的部分内容
let p = Point(0, 1, 2);
match p {
Point(x, ..) => println!("x is {}", x),
}
这是一个不一致的地方,因此随着 RFC 1492 的稳定,从这个版本开始可以正常编译。这适用于比元组更多的情况;请参阅RFC了解更多详细信息。
库的稳定化
标准库中添加了很多内容,但它们不属于这个版本的特定类别。以下是重点:
println!()
,如果没有参数,则打印换行符。以前,需要一个空字符串才能实现相同的功能。Wrapping
在引用上实现标准二进制和一元运算符,以及Sum
和Product
迭代器,使得这些类型的引用更容易使用。- 实现
From<Cow<str>> for String
和From<Cow<[T]>> for Vec<T>
。这些实现是有意义的,但尚未添加。 - 将
.zip()
特化扩展到.map()
和.cloned()
,以提高性能。 - 为原子类型实现
RefUnwindSafe
,因为这些类型是“unwind safe”的,尽管起初这一点并不明显。 - 将
Vec::extend
特化为Vec::extend_from_slice
以提高性能。 - 不要重用
HashMap
随机种子。这有助于缓解一种类型的 DDoS 攻击。 HashMap
的内部内存布局更缓存友好,可以在某些操作中显着提高性能。- 为
Cow<str>
实现Add<{str, Cow<str>}>
。我们已经支持其他字符串类型的Add
,因此在Cow
上没有它是不一致的。
请参阅详细发行说明了解更多信息。
Cargo 特性
对于 Cargo,RFC 1721 已实现。Cargo 现在会将 rustc --print cfg
打印的值传递给构建脚本。此功能的动机是 Cargo 现在可以为静态链接 MSVC 平台上的 msvcrt 编译对象。
Cargo 现在可以使用只读 CARGO_HOME
正常工作。
最后,Cargo 将忽略 test
和 bench
配置文件的 panic
配置。这很重要,因为测试运行器依赖于将 panic 视为失败的测试,因此使用 panic=abort
,失败的测试会中止整个测试套件。
请参阅详细发行说明了解更多信息。
1.14.0 的贡献者
共有 144 位个人为 1.14.0 做出了贡献。非常感谢!
- Abhishek Chanda
- Adam Perry
- Ahmed Charles
- Aidan Hobson Sayers
- Aleksey Kladov
- Alexander von Gluck IV
- Alex Burka
- Alex Crichton
- Alex von Gluck IV
- Amanieu d'Antras
- Andrea Corradi
- Andrea Pretto
- Andreas Sommer
- Andre Bogus
- Andrew Paseltiner
- angelsl
- Anthony Ramine
- Ariel Ben-Yehuda
- arthurprs
- Austin Hicks
- bors
- Brian Anderson
- Bunts Thy Unholy
- CensoredUsername
- Chris McDonald
- Christopher
- christopherdumas
- Christopher Serr
- Cobrand
- Corey Farwell
- Cristi Cobzarenco
- Daan Sprenkels
- Danny Hua
- David Henningsson
- Devon Hollowood
- Dmitry Gritsay
- Dominik Inführ
- Duncan
- Eduard Burtescu
- Eduard-Mihai Burtescu
- Eric Roshan-Eisner
- est31
- Fabian Frei
- Federico Mena Quintero
- Felix S. Klock II
- Florian Diebold
- Florian Hartwig
- Florian Zeitz
- Frank Rehberger
- Gavin Baker
- Geoffry Song
- Guillaume Gomez
- iirelu
- James Miller
- Jan-Erik Rediger
- Jared Roesch
- Jeffrey Seyfried
- Jesus Garlea
- Jethro Beekman
- Joe Neeman
- Johannes Muenzel
- John Firebaugh
- John Hodge
- johnthagen
- Jonas Schievink
- Jonathan Turner
- Jorge Aparicio
- Josh Stone
- Josh Triplett
- Keegan McAllister
- Keith Yeung
- KillTheMule
- Konrad Borowski
- leonardo.yvens
- Liigo Zhuang
- loggerhead
- Manish Goregaokar
- Marcin Fatyga
- Mark-Simulacrum
- Martin Glagla
- Martin Thoresen
- Mathieu Borderé
- Mathieu Poumeyrol
- Matt Brubeck
- Matthew Piziak
- Matwey V. Kornilov
- mcarton
- Michael Woerister
- Mikhail Modin
- Mikko Rantanen
- msiglreith
- Nabeel Omer
- Nathan Musoke
- Nicholas Nethercote
- Nick Cameron
- Nick Fitzgerald
- Nick Stevens
- Nikhil Shagrithaya
- Niko Matsakis
- Oliver Middleton
- p512
- ParkHanbum
- Paul Lange
- Paulo Matos
- Paul Osborne
- Peter Atashian
- Peter N
- Philip Davis
- Pieter Frenssen
- Pweaver (Paul Weaver)
- pweyck
- QuietMisdreavus
- Raph Levien
- Razican
- Robin Stocker
- Ross Schulman
- Ryan Senior
- Scott Olson
- Seo Sanghyeon
- Simonas Kazlauskas
- Simon Sapin
- Srinivas Reddy Thatiparthy
- Stefan Schindler
- Stephen M. Coakley
- Steve Klabnik
- Steven Fackler
- Tamir Duberstein
- Taylor Cramer
- Tim Neumann
- Tobias Bucher
- Tomasz Miąsko
- tormol
- Tshepang Lekhonkhobe
- Ulrik Sverdrup
- Vadim Chugunov
- Vadim Petrochenkov
- Vadzim Dambrouski
- Vangelis Katsikaros
- Wang Xuerui
- Wesley Wiser
- Zack M. Davis
- Zoffix Znet
- Артём Павлов [Artyom Pavlov]
- 石博文