Rust 团队日前发布了 Rust 的新版别 —— 1.70.0 正式版,Rust 是一种编程言语,它使每个人都能构建可靠、高效的软件。

关于 1.70.0 有关新特性可检查:blog.rust-lang.org/2023/06/01/…

假如现已装置了曾经版别的 Rust,能够经过以下指令升级到 1.70.0:

$ rustup update stable

假如还没有装置,能够从网站上的相应页面获取rustup并装置,能够在 GitHub 上检查1.70.0 的具体发行阐明。

1.70.0 安稳版中有什么?

Crates.io 默许启用稀少索引

Cargo 的 “sparse” 协议现在默许启用,用于从 crates.io 读取索引。这个功用之前现已在 Rust 1.68.0 中安稳下来,但仍然需求装备才能在 crates.io 中运用。原计划就是在 1.70.0 中默许启用该功用的,现在如期实现。

当你从 crates.io 的索引中获取信息时,你应该看到性能的大幅进步。假如由于某些原因,你需求保持曾经的默许状况,即运用 GitHub 保管的 git 索引,能够运用registries.crates-io.protocol装备设置来改动默许状况。

需求留意的是,改动访问方法的一个副作用是,这也改动了 crate cache 的途径,所以依赖将被从头下载。

OnceCell 和 OnceLock

OnceCell和它的线程安全对应类型OnceLock两个新的类型现已安稳下来,用于共享数据的一次性初始化。这两种类型能够用在任何不期望立即构建的地方。

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_staticonce_cell等 crate 在过去填补了这一需求,但现在这些构建块是标准库的一部分,由once_cellunsyncsync模块移植过来。未来还有更多的方法或许会被安稳化,还有配套LazyCellLazyLock存储其初始化函数的类型。

IsTerminal

这个新安稳的特性is_terminal,用来确认一个给定的文件 descriptor(描述符)或 handle(句柄)是否代表一个终端或 TTY。一个常见的用例是让程序区分运行在脚本形式还是交互形式下,比如在交互式形式下呈现色彩或者是完整的 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。这些调试等级现在能够经过称号来设置:"none"(0)"limited"(1)和 "full"(2),以及两个新的等级:”line-directives-only” 和 “line-tables-only”。

留意,这些命名的选项还不能经过Cargo.toml运用,在下一个 1.71 版别中会有这方面的支持。

test CLI中的强制安稳性

#[test]函数被编译时,可执行文件从testcrate 获得一个指令行接口。这个 CLI 有很多选项,包含一些没有安稳的选项,需求指定-Zunstable-options,就像 Rust 工具链中的许多其他指令一样。然而,尽管这只是在 nightly 构建中被答应的,但这个约束在test中并不适用。不过,从 1.70.0 开始,Rust 的安稳版和测试版将不再答应不安稳的test选项。

在一些已知的情况下,不安稳的选项或许在用户不知情的情况下被运用,特别是 IntelliJ Rust 和其他 IDE 插件中运用的--format 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

关于1.70.0 升级的更多信息,建议访问:

  • What’s in 1.70.0 stable
  • 1.70.0 的具体发行阐明