Rust团队很高兴地宣布新版本的Rust,1.70.0。Rust是一种编程语言,使每个人都能建立可靠和高效的软件。
如果你通过rustup安装了以前的Rust版本,你可以用1.70.0获得:
rustup update stable
如果你还没有,你可以从我们网站上的相应页面获得rustup,并在GitHub上查看1.70.0的详细发布说明。
如果你想通过测试未来的版本来帮助我们,你可以考虑在本地更新,使用beta通道(rustup默认beta)或nightly通道(rustup默认nightly)。请报告你可能遇到的任何bug!
1.70.0稳定版中的内容
crates.io默认为稀疏状态
Cargo的 “稀疏 “协议现在默认启用,用于从crates.io读取索引。这个功能之前在Rust 1.68.0中已经稳定了,但仍然需要配置才能在crates.io中使用该功能。宣布的计划是在1.70.0中把它变成默认的,现在就是这样了
当你从 crates.io 索引中获取信息时,你应该看到性能的大幅提升。在限制性防火墙后面的用户将需要确保可以访问https://index.crates.io。如果由于某些原因,你需要保持以前的默认状态,即使用GitHub托管的git索引,可以使用registries.crates-io.protocol配置设置来改变默认状态。
需要注意的是,改变访问方式的一个副作用是,这也会改变板块缓存的路径,所以依赖性会被重新下载。一旦你完全承诺使用稀疏协议,你可能想清除旧的$CARGO_HOME/registry/*/github.com-*路径。
OnceCell和OnceLock
两个新的类型已经稳定下来,用于共享数据的一次性初始化,即OnceCell和其线程安全的对应类型OnceLock。这两种类型可以用在不希望立即构建的地方,甚至不可能像全局变量中的非const数据那样。
use std::sync::OnceLock;
static WINNER: OnceLock<&str> = OnceLock::new();
fn main() {
let winner = std::thread::scope(|s| {
s.spawn(|| WINNER.set("thread"));
std::thread::yield_now(); // give them a chance...
WINNER.get_or_init(|| "main")
});
println!("{winner} wins!");
}
在过去,像lazy_static和once_cell这样的板块已经满足了这个需求,但现在这些板块已经成为标准库的一部分,从once_cell的unsync和sync模块移植过来。未来还有更多的方法可能会被稳定化,以及存储其初始化函数的同伴LazyCell和LazyLock类型,但这稳定化的第一步应该已经涵盖了许多用例。
IsTerminal
这个新稳定的特性有一个方法,is_terminal,用来确定一个给定的文件描述符或句柄是否代表一个终端或TTY。这是标准化功能的另一个案例,这些功能存在于外部板块,如atty和is-terminal,在Unix目标上使用C库的isatty函数,在其他地方使用类似的功能。一个常见的用例是让程序区分在脚本或交互式模式下运行,比如在交互式模式下呈现颜色,甚至是一个完整的TUI。
use std::io::{stdout, IsTerminal};
fn main() {
let use_color = stdout().is_terminal();
// if so, add color codes to program output...
}
调试信息的命名级别
以前,-Cdebuginfo编译器选项只支持数字0…=2来增加调试信息量,Cargo在开发和测试配置文件中默认为2,在发布和基准配置文件中默认为0。现在,这些调试级别可以通过名称来设置:”无”(0)、”有限”(1)和 “完全”(2),以及两个新的级别,”仅行指令 “和 “仅行表”。
Cargo 和 rustc 文档以前都称第 1 级为 “仅行表”,但它不止有所有函数的信息,只是没有类型和变量。这个级别现在被称为 “有限”,而新的 “仅行表 “级别被进一步缩减为带文件名和行号的回溯所需的最小值。这可能最终成为用于-Cdebuginfo=1的级别。另一个 “仅行指令 “级别是为NVPTX剖析准备的,除此之外不推荐使用。
注意,这些命名的选项还不能通过Cargo.toml使用。对它的支持将在下一个1.71版本中提供。
测试CLI中的强制稳定性
当#[test]函数被编译时,可执行文件会从test crate获得一个命令行界面。这个CLI有很多选项,包括一些尚未稳定的选项,也需要指定-Zunstable-options,就像Rust工具链中的许多其他命令一样。然而,虽然这只打算在夜间构建中允许,但这个限制在测试中并不活跃–直到现在。从1.70.0开始,Rust的稳定版和测试版将不再允许不稳定的测试选项,从而使它们真正成为文件规定的只在夜间使用的版本。
在一些已知的案例中,不稳定的选项可能在用户不知情的情况下被使用,特别是在IntelliJ Rust和其他IDE插件中使用的–format json。这些项目已经在适应这一变化,JSON输出的状态可以在其跟踪问题中得到关注。
稳定的API
NonZero*::MIN/MAX
BinaryHeap::retain
Default for std::collections::binary_heap::IntoIter
Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
Default for std::collections::btree_map::{IntoKeys, Keys}
Default for std::collections::btree_map::{IntoValues, Values}
Default for std::collections::btree_map::Range
Default for std::collections::btree_set::{IntoIter, Iter}
Default for std::collections::btree_set::Range
Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
Default for std::vec::IntoIter
Default for std::iter::Chain
Default for std::iter::Cloned
Default for std::iter::Copied
Default for std::iter::Enumerate
Default for std::iter::Flatten
Default for std::iter::Fuse
Default for std::iter::Rev
Default for std::slice::Iter
Default for std::slice::IterMut
Rc::into_inner
Arc::into_inner
std::cell::OnceCell
Option::is_some_and
NonNull::slice_from_raw_parts
Result::is_ok_and
Result::is_err_and
std::sync::atomic::Atomic*::as_ptr
std::io::IsTerminal
std::os::linux::net::SocketAddrExt
std::os::unix::net::UnixDatagram::bind_addr
std::os::unix::net::UnixDatagram::connect_addr
std::os::unix::net::UnixDatagram::send_to_addr
std::os::unix::net::UnixListener::bind_addr
std::path::Path::as_mut_os_str
std::sync::OnceLock
其他变化
查看Rust、Cargo和Clippy中的所有变化。
1.70.0的贡献者
许多人共同创建了Rust 1.70.0。没有你们,我们不可能做到这一点。谢谢你们!