• Rust 1.70.0正式版发布 快来看一下有哪些新特性吧
  • 发布于 2个月前
  • 323 热度
    0 评论
Rust 团队日前发布了 Rust 的新版本 —— 1.70.0 正式版,Rust 是一种编程语言,它使每个人都能构建可靠、高效的软件。关于 1.70.0 有关新特性可查看:https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html

如果已经安装了以前版本的 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(); // 堆代码 duidaima.com

        WINNER.get_or_init(|| "main")
    });

    println!("{winner} wins!");
 }
诸如 lazy_static 和 once_cell 等 crate 在过去填补了这一需求,但现在这些构建块是标准库的一部分,由 once_cell 的 unsync 和 sync 模块移植过来。未来还有更多的方法可能会被稳定化,还有配套 LazyCell 和 LazyLock 存储其初始化函数的类型。

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] 函数被编译时,可执行文件从 test crate 获得一个命令行接口。这个 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:https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html
1.70.0 的详细发行说明:https://github.com/rust-lang/rust/releases/tag/1.70.0
用户评论