1.80.0
稳定版
LazyCell
和LazyLock
这些"懒"
类型会延迟初化其数据
,直到第一次访问
.它们类似1.70
中稳定的OnceCell
和OnceLock
类型,但单元
中包含初化函数
.
这稳定化了从流行的lazy_static
和once_cell
中进入标准库
.
LazyLock
是线安选项
,使其适合静态值
等位置.如,产生线程
和主域
都会看见如下完全相同持续时间
,因为无论谁最终
先访问静
,都会初化一次LAZY_TIME
.
与用OnceLock::get_or_init()
不同,这两个用户
都不必知道
如何初化它
.
use std::sync::LazyLock;
use std::time::Instant;
static LAZY_TIME: LazyLock<Instant> = LazyLock::new(Instant::now);
fn main() {
let start = Instant::now();
std::thread::scope(|s| {
s.spawn(|| {
println!("Thread lazy time is {:?}", LAZY_TIME.duration_since(start));
});
println!("Main lazy time is {:?}", LAZY_TIME.duration_since(start));
});
}
LazyCell
在不同步线程
时,也是一样
的,所以它没有实现静
需要的同步
,但仍可在thread_local!静
中使用它
(每线程有不同初化
).
根据线安需求
,也可在其他数据结构
中用这两个类
,因此懒初化
无处不在!
检查配置
名和值
在1.79
中,rustc
稳定了一个--check-cfg
标志,现在Cargo1.80
对它知道的所有配置
名和值(除了rustc
中周知名和值
),都允许这些检查
.
这包括Cargo.toml
中的函数名
及构建脚本
的新的cargo::rustc-check-cfg
输出.
由默认警告
的抓拼写错误或其他错误配置
的unexpected_cfgs
检查器报告意外的配置
.如,在有可选rayon
依赖的项目中,为错误的特征
值配置此代码
:
fn main() {
println!("Hello, world!");
#[cfg(feature = "crayon")]
rayon::join(
|| println!("Hello, Thing One!"),
|| println!("Hello, Thing Two!"),
);
}
警告:意外的"配置"
条件值:"Crayon"
.
Cargo.toml
清单中的[lints]
表也可用来扩展
自定义配置
的已知名和值列表
.rustc
会自动
提供要在警告
中使用的语法.
[lints.rust]
unexpected_cfgs = { level = "warn", checkcfg = ['cfg(foo, values("bar"))'] }
模式中的独占区间
Rust
区间模式现在
可用独占端点
,写成类似Range
和RangeTo
式类型的a..b
或..b
.如,以下模式
现在可对一个模式
的结束
和下个模式
的开始
使用相同常数
:
pub fn size_prefix(n: u32) -> &'static str {
const K: u32 = 10u32.pow(3);
const M: u32 = 10u32.pow(6);
const G: u32 = 10u32.pow(9);
match n {
..K => "",
K..M => "k",
M..G => "M",
G.. => "G",
}
}
稳定的API
impl Default for Rc<CStr>
impl Default for Rc<str>
impl Default for Rc<[T]>
impl Default for Arc<str>
impl Default for Arc<CStr>
impl Default for Arc<[T]>
impl IntoIterator for Box<[T]>
impl FromIterator<String> for Box<str>
impl FromIterator<char> for Box<str>
LazyCell
LazyLock
Duration::div_duration_f32
Duration::div_duration_f64
Option::take_if
Seek::seek_relative
BinaryHeap::as_slice
NonNull::offset
NonNull::byte_offset
NonNull::add
NonNull::byte_add
NonNull::sub
NonNull::byte_sub
NonNull::offset_from
NonNull::byte_offset_from
NonNull::read
NonNull::read_volatile
NonNull::read_unaligned
NonNull::write
NonNull::write_volatile
NonNull::write_unaligned
NonNull::write_bytes
NonNull::copy_to
NonNull::copy_to_nonoverlapping
NonNull::copy_from
NonNull::copy_from_nonoverlapping
NonNull::replace
NonNull::swap
NonNull::drop_in_place
NonNull::align_offset
<[T]>::split_at_checked
<[T]>::split_at_mut_checked
str::split_at_checked
str::split_at_mut_checked
str::trim_ascii
str::trim_ascii_start
str::trim_ascii_end
<[u8]>::trim_ascii
<[u8]>::trim_ascii_start
<[u8]>::trim_ascii_end
Ipv4Addr::BITS
Ipv4Addr::to_bits
Ipv4Addr::from_bits
Ipv6Addr::BITS
Ipv6Addr::to_bits
Ipv6Addr::from_bits
Vec::<[T; N]>::into_flattened
<[[T; N]]>::as_flattened
<[[T; N]]>::as_flattened_mut
稳定的常API
<[T]>::last_chunk
BinaryHeap::new