rust - 如何访问线程本地 LocalKey 静态变量?

标签 rust

我正在尝试使用本地线程 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! , RefCellRwLock, borrow()read(), borrow_mut()write(),您将不再需要 with

关于rust - 如何访问线程本地 LocalKey 静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46866543/

相关文章:

rust - 如何在不分配的情况下使用 Read 跳过 N 个字节?

match - 由于无法访问模式,Rust 匹配失败

rust - 如何使用返回可变引用的迭代器创建自己的数据结构?

rust - 如何在返回 Result<() , Error> 的函数中从 Serde 返回错误

rust - 从 future 流中获取所有可用项目(非阻塞)

rust - cargo 是否有能力检测源变化?

rust - 将切片过滤成向量

rust - 如何将结构从 Actix 中间件传递给处理程序?

function - 结构拥有函数的 Rust 作用域规则

rust - 有没有办法选择两个生命周期中较小的一个?