Rust 团队很高兴地宣布 Rust 的最新版本 1.15.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您已安装了 Rust 的早期版本,则只需执行以下操作即可获取 Rust 1.15:
$ rustup update stable
如果您还没有安装 Rust,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上1.15.0 的详细发行说明。此版本共提交了 1443 个补丁。
1.15.0 稳定版中的新特性
Rust 1.15 带来了一个非常令人期待的功能:自定义派生!回顾一下,在 Rust 中,您始终可以通过 derive
属性自动实现一些 trait:
#[derive(Debug)]
struct Pet {
name: String,
}
然后为 Pet
实现了 Debug
trait,大大减少了样板代码。但是,这仅适用于标准库中提供的 trait;它不可自定义。在 Rust 1.15 中,它现在可以自定义了。这意味着,如果您想将您的 Pet
转换为 JSON,只需将 Serde 添加到您的 Cargo.toml
中即可:
[dependencies]
serde = "0.9"
serde_derive = "0.9"
serde_json = "0.9"
并将另一个 trait 添加到您的 Pet
中:
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize, Deserialize, Debug)]
struct Pet {
name: String,
}
fn main() {
let pet = Pet { name: String::from("Ferris") };
let serialized = serde_json::to_string(&pet).unwrap();
println!("serialized = {}", serialized);
let deserialized: Pet = serde_json::from_str(&serialized).unwrap();
println!("deserialized = {:?}", deserialized);
}
这将输出:
serialized = {"name":"Ferris"}
deserialized = Pet { name: "Ferris" }
另一个常见的用例是 Diesel。假设我们有一个 Pet
的数据库。我们可以像这样获取它们:
// some extern crate and use lines elided here
#[derive(Queryable)]
struct Pet {
name: String,
}
fn main() {
use diesel_demo::schema::pets::dsl::*;
let connection = establish_connection();
let results = pets
.limit(5)
.load::<Pet>(&connection)
.expect("Error loading pets");
println!("Displaying {} pets", results.len());
for pet in results {
println!("{}", pet.name);
}
}
有关完整说明,请参阅 该网站。
这类库功能非常强大,但依赖于自定义派生来实现人体工程学。虽然这些库以前在 Rust 稳定版上可以工作,但它们的使用体验并不好,以至于我们经常听到用户说“我只使用 nightly 版本,因为需要 Serde 和 Diesel。”自定义派生是使用最广泛的仅在 nightly 版本中可用的功能之一。因此,为了支持此用例,去年 7 月提出了 RFC 1681。该 RFC 在 8 月合并,经过大量开发和测试,现在终于在今天发布了稳定版!
要了解如何编写自己的自定义派生,请参阅《Rust 程序设计语言》的章节。
虽然我们在此处多次提到了“Serde 和 Diesel”,但您可以通过自定义派生做很多其他很酷的事情:例如,请参阅 derive-new
。有关更多信息,请参阅 syn
crate 的反向依赖项。(syn
对于编写自定义派生非常重要,有关详细信息,请参阅上面链接的书籍章节。) 自定义派生也称为“宏 1.1”,因为它包括支持 Rust 更强大的编译时功能的框架,这些功能被昵称为“宏 2.0”。预计在未来的版本中会听到更多关于这方面的信息。
其他改进
Rust 的构建系统 已使用 Cargo 以 Rust 重新编写。现在它是默认的。这个过程很漫长,但终于取得了成果。鉴于所有 Rust 开发都在主分支上进行,我们自去年 12 月以来一直在使用它,并且它运行良好。有一个开放的 PR 用于完全删除 Makefile,将在 Rust 1.17 中发布。这将为 rustc
在编译器中像任何其他 Rust 项目一样使用来自 crates.io
的包铺平道路,并且进一步证明了 Cargo 的成熟度。
Rust 已为 i686-unknown-openbsd
、MSP430
和 ARMv5TE
获得了 Tier 3 支持。
许多编译器性能改进已发布。我们正在继续努力使编译器更快。期望在未来看到更多改进!
作为一个较小的改进,?Sized
现在可以在 where
子句中使用。换句话说:
struct Foo<T: ?Sized> {
f: T,
}
struct Foo<T> where T: ?Sized {
f: T,
}
现在接受第二种形式,并且它等效于第一种形式。
有关更多信息,请参阅详细发行说明。
库稳定化
slice::sort
算法已重写,并且速度快得多、得多。它是一种混合归并排序,借鉴了 Timsort 的影响。以前它是一个直接的归并排序。
如果您有一个 Vec<T>
,其中 T: Copy
,并且您对其调用了 extend
,那么您的代码现在将快得多。
说到速度变快,chars().count()
、chars().last()
和 char_indices().last()
也是如此!
还有许多函数已稳定化:
std::iter::Iterator::min_by
和std::iter::Iterator::max_by
std::os::*::fs::FileExt
std::sync::atomic::Atomic*::get_mut
和std::sync::atomic::Atomic*::into_inner
std::vec::IntoIter::as_slice
和std::vec::IntoIter::as_mut_slice
std::sync::mpsc::Receiver::try_iter
std::os::unix::process::CommandExt::before_exec
std::rc::Rc::strong_count
和std::rc::Rc::weak_count
std::sync::Arc::strong_count
和std::sync::Arc::weak_count
std::char::encode_utf8
和std::char::encode_utf16
std::cell::Ref::clone
std::io::Take::into_inner
有关更多信息,请参阅详细发行说明。
Cargo 功能
如果您的包的顶层有一个名为 build.rs
的文件,但没有 build = "build.rs"
注释,Cargo 现在会发出警告。这是为了预期推断顶层的 build.rs
始终是一个构建脚本,但目前出于兼容性原因,这是一个警告。以前,所有构建脚本都需要配置,但此约定在社区中很强大,因此我们将把它编码到 Cargo 中。
在此版本中,Cargo 构建脚本不再能够通过 env!("OUT_DIR")
在构建时访问 OUT_DIR
环境变量。它们应该改为在运行时使用 std::env
检查该变量。该值在构建时设置是一个错误,并且在交叉编译时是不正确的。请检查您的包正在执行的操作并更新为使用 std::env
!
cargo test
命令增加了对 --all
标志的支持,这在您有一个工作区时非常有用。
现在,我们在 Windows 上静态编译 MSVC CRT,并在 Mac OS X 上静态链接 OpenSSL。
有关更多信息,请参阅详细发行说明。
1.15.0 的贡献者
在发布公告的这一部分中,我们通常会发布贡献者列表。但是,我们最近启动了一个新的倡议“Thanks!”,以更全面的方式来做到这一点。此部分的一个问题是,它只计算对 rust-lang/rust
存储库的贡献;例如,对 Cargo 做出贡献的人没有被感谢。我们还必须手动生成此列表,这并不算太糟糕,但是运行正确的 git 命令来确定谁做出了贡献正是代码擅长的!
因此,您现在可以访问 https://thanks.rust-lang.org/ 来查看更全面的贡献计算。如果您愿意,我们还有一个别名,位于 https://❤.rust-lang.org。目前,这将只显示我们在以前的发布帖子中显示的内容。我们确实有一个附加功能,这是一个按提交计数排序的历来贡献列表。它位于此处:https://thanks.rust-lang.org/rust/all-time
我们已经完成了一些必要的后端工作,以启用比 rust-lang/rust
更多的存储库,但这尚未完全完成。如果您想参与其中,请查看 GitHub 上的 thanks!
共有 137 位个人为 Rust 1.15 做出了贡献。 谢谢!