我正在尝试使用本地线程 LocalKey
拥有一个全局游戏变量,用户可以在游戏开始时设置一次。
我终于在 with
block 中设置了一个新的 PLAYER_NAME
来编译它:
use std::thread::LocalKey;
use std::borrow::BorrowMut;
thread_local! {
pub static PLAYER_NAME: String = String::from("player-one");
}
fn main() {
let p: String = String::from("new-name");
PLAYER_NAME.with(|mut player_name| {
let player_name = p;
});
println!("PLAYER_NAME is: {:?}", PLAYER_NAME);
}
打印出来:
PLAYER_NAME is: LocalKey { .. }
如何打印 PLAYER_NAME
的字符串值?每次我想阅读它时是否都必须使用 with
block ?
最佳答案
Do I have to use a
with
block every time I want to read it too?
是的,如果您直接访问 PLAYER_NAME
- 请参阅 @Shepmaster's answer举个例子。但是您在实际程序中通常做的是将对全局的访问封装在函数中,这为您购买了您从其他语言中了解的使用模式,而不会损失性能或便利性。例如:
use std::cell::RefCell;
thread_local! {
pub static PLAYER_NAME: RefCell<String>
= RefCell::new("player-one".to_string());
}
fn set_player_name(name: String) {
PLAYER_NAME.with(|player_name| {
*player_name.borrow_mut() = name
});
}
fn get_player_name() -> String {
PLAYER_NAME.with(|player_name| player_name.borrow().clone())
}
fn main() {
assert_eq!(get_player_name(), "player-one".to_string());
set_player_name("mini me".to_string());
assert_eq!(get_player_name(), "mini me".to_string());
}
如果您不希望播放器名称是每个线程的,则将 thread_local!
替换为 lazy_static!
, RefCell
与 RwLock
, borrow()
与 read()
, borrow_mut()
与 write()
,您将不再需要 with
。
关于rust - 如何访问线程本地 LocalKey 静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46866543/