Rust 1-73-0 新特性:thread_local- 宏的新方法
在 Rust 標準庫中的 thread_local! 宏中,有一個靜態類型 std::thread::LocalKey,用於存儲本地線程的鍵,此鍵使用目標平臺上可用的最快實現。
它是 thread_local! 宏的一個實例,在 Rust 1.73.0 以前的版本,主要使用 LocalKey 的 with 方法,現在可以直接使用 LocalKey 的 get()、set()、take()、replace() 等方法了。
下面看一下新方法的例子。
Get 方法
get() 方法用於返回所包含值的副本。如果線程還沒有引用這個鍵,它將惰性地初始化這個值。
use std::cell::Cell;
thread_local! {
static X: Cell<i32> = Cell::new(1);
}
fn main() {
assert_eq!(X.get(), 1);
}
Set 方法
set() 方法用於設置或初始化包含的值。與其他方法不同,這不會運行本地線程的惰性初始化器。相反,如果它還沒有初始化,它將直接用給定的值初始化。
use std::cell::Cell;
thread_local! {
static X: Cell<i32> = panic!("!");
}
fn main() {
// 跳過了上面的初始化式,直接用給定的值進行初始化了
X.set(123);
assert_eq!(X.get(), 123);
}
Take 方法
take() 方法用於獲取包含的值,原來位置的值將使用 Default:: Default() 覆蓋。如果這個線程還沒有引用這個鍵,它將惰性地初始化這個值。
use std::cell::Cell;
thread_local! {
static X: Cell<Option<i32>> = Cell::new(Some(1));
}
fn main() {
assert_eq!(X.take(), Some(1));
assert_eq!(X.take(), None);
}
Replace 方法
replace() 方法用於將新值替換舊值,並返回舊值。如果這個線程還沒有引用這個鍵,它將惰性地初始化這個值。
use std::cell::Cell;
thread_local! {
static X: Cell<i32> = Cell::new(1);
}
fn main() {
assert_eq!(X.replace(2), 1);
assert_eq!(X.replace(3), 2);
}
總結
新方法使公共代碼更加簡潔,並且對於新線程,避免了爲 thread_local 中指定的默認值運行額外的初始化代碼。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/mbM6pxfYKxr-e-ycb-PxDg