Rust 团队很高兴地宣布最新版本的 Rust 1.20.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您已经安装了以前版本的 Rust,则获取 Rust 1.20 非常简单:
$ rustup update stable
如果您还没有安装,可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上1.20.0 的详细发行说明。
1.20.0 稳定版的新特性
在之前的 Rust 版本中,您可以定义具有“关联函数”的 traits、结构体和枚举:
struct Struct;
impl Struct {
fn foo() {
println!("foo is an associated function of Struct");
}
}
fn main() {
Struct::foo();
}
这些被称为“关联函数”,因为它们是与类型关联的函数,也就是说,它们附加到类型本身,而不是任何特定的实例。
Rust 1.20 添加了定义“关联常量”的功能:
struct Struct;
impl Struct {
const ID: u32 = 0;
}
fn main() {
println!("the ID of Struct is: {}", Struct::ID);
}
也就是说,常量 ID
与 Struct
相关联。与函数一样,关联常量也适用于 traits 和枚举。
Traits 在关联常量方面具有额外的能力,这赋予了它们额外的功能。对于 trait,您可以像使用关联类型一样使用关联常量:声明它,但不给它一个值。trait 的实现者然后在实现时声明其值:
trait Trait {
const ID: u32;
}
struct Struct;
impl Trait for Struct {
const ID: u32 = 5;
}
fn main() {
println!("{}", Struct::ID);
}
在此版本之前,如果您想创建一个表示浮点数的 trait,您必须这样写:
trait Float {
fn nan() -> Self;
fn infinity() -> Self;
...
}
这有点笨拙,但更重要的是,因为它们是函数,所以即使它们只返回常量,也不能在常量表达式中使用。因此,Float
的设计还必须包含常量:
mod f32 {
const NAN: f32 = 0.0f32 / 0.0f32;
const INFINITY: f32 = 1.0f32 / 0.0f32;
impl Float for f32 {
fn nan() -> Self {
f32::NAN
}
fn infinity() -> Self {
f32::INFINITY
}
}
}
关联常量使您可以更清晰地执行此操作。此 trait 定义:
trait Float {
const NAN: Self;
const INFINITY: Self;
...
}
导致此实现:
mod f32 {
impl Float for f32 {
const NAN: f32 = 0.0f32 / 0.0f32;
const INFINITY: f32 = 1.0f32 / 0.0f32;
}
}
更清晰,用途更广泛。
关联常量是在RFC 195中提出的,几乎在三年前。这个功能已经有一段时间了!该 RFC 包含所有关联项,不仅仅是常量,因此其中的一些项,例如关联类型,比其他项更快地实现。总的来说,我们一直在为常量求值进行大量内部工作,以提高 Rust 的编译时元编程能力。期待未来在这方面有更多进展。
我们还修复了一个错误,该错误发生在文档测试中 include!
宏中使用相对路径时,它错误地相对于工作目录,而不是相对于当前文件。
有关更多信息,请参阅详细发行说明。
库的稳定化
此版本中库中没有什么超级令人兴奋的内容,只是进行了一些扎实的改进并继续稳定 API。
unimplemented!
宏现在接受消息,让您可以说明为什么某些内容尚未实现。
浮点类型的 min
和 max
已用 Rust 重写,不再依赖 cmath
。
我们在此版本中发布了针对 Stack Clash 的缓解措施,特别是 堆栈探测 和 在 Linux 上跳过主线程的手动堆栈保护。您无需执行任何操作即可获得这些保护,只需使用 Rust 1.20 即可。
我们在标准库中添加了一组新的排序函数:slice::sort_unstable_by_key
、slice::sort_unstable_by
和 slice::sort_unstable
。您会注意到这些名称中都带有“unstable”。稳定性是排序算法的一个属性,可能对您来说很重要,也可能不重要,但现在您有了这两种选择!以下是简要总结:假设我们有一个这样的单词列表:
rust
crate
package
cargo
这两个单词 cargo
和 crate
都以字母 c
开头。仅按首字母排序的稳定排序必须产生此结果:
crate
cargo
package
rust
也就是说,因为 crate
在原始列表中位于 cargo
之前,所以它也必须在最终列表中位于其之前。不稳定的排序可以提供该结果,但也可能给出此答案:
cargo
crate
package
rust
也就是说,结果可能不是按相同的原始顺序排列的。
您可能会想到,约束越少通常意味着结果越快。如果您不关心稳定性,这些排序可能比稳定变体更快。和往常一样,最好同时检查两者,看看哪个更好!这些函数是由 RFC 1884 添加的,如果您想了解更多详细信息,包括基准测试。
此外,以下 API 也已稳定:
CStr::into_c_string
CString::as_c_str
和CString::into_boxed_c_str
Chain::get_mut
、Chain::get_ref
和Chain::into_inner
Option::get_or_insert_with
和Option::get_or_insert
OsStr::into_os_string
OsString::into_boxed_os_str
Take::get_mut
和Take::get_ref
Utf8Error::error_len
char::EscapeDebug
和char::escape_debug
compile_error!
f32::from_bits
和f32::to_bits
f64::from_bits
和f64::to_bits
mem::ManuallyDrop
str::from_boxed_utf8_unchecked
str::as_bytes_mut
str::from_utf8_mut
和str::from_utf8_unchecked_mut
str::get_unchecked
和str::get_unchecked_mut
str::get
和str::get_mut
str::into_boxed_bytes
有关更多信息,请参阅详细发行说明。
Cargo 功能
Cargo 在此版本中进行了一些不错的升级。首先,您的 crates.io 身份验证令牌以前存储在 ~/.cargo/config
中。作为配置文件,这通常会以 644
权限存储,也就是说,对所有人可读。但是它其中包含一个秘密令牌。我们已将令牌移动到 ~/.cargo/credentials
,以便可以将其权限设置为 600
,并对系统上的其他用户隐藏。
如果您在 Cargo 包中使用辅助二进制文件,您就知道它们保存在 src/bin
中。但是,有时您需要多个具有重要逻辑的辅助二进制文件;在这种情况下,您将拥有 src/bin/client.rs
和 src/bin/server.rs
,它们的任何子模块都将放在同一目录中。这令人困惑。相反,我们现在按惯例支持 src/bin/client/main.rs
和 src/bin/server/main.rs
,以便您可以将较大的二进制文件彼此分开存放。
有关更多信息,请参阅详细发行说明。
1.20.0 的贡献者
许多人共同创建了 Rust 1.20。没有大家,我们无法完成这项工作。谢谢!