gpt4 book ai didi

rust - 有没有一种干净的方法可以在 Rust 插件中拥有全局可变状态?

转载 作者:行者123 更新时间:2023-11-29 07:54:59 25 4
gpt4 key购买 nike

我发现这样做的唯一方法是使用不安全的单例函数:

fn singleton() -> &'static mut HashSet<String> {
static mut hash_map: *mut HashSet<String> = 0 as *mut HashSet<String>;

let map: HashSet<String> = HashSet::new();
unsafe {
if hash_map == 0 as *mut HashSet<String> {
hash_map = mem::transmute(Box::new(map));
}
&mut *hash_map
}
}

有没有更好的方法?或许我们可以在 plugin_registrar 函数中做点什么?

我所说的全局可变状态是指可由多个过程宏和/或属性使用的可变变量。

更新:

我正在编写一个编译器插件来提供一个 sql! 过程宏。我有一个用于结构的 #[sql_table] 属性,这样我就可以获得 SQL 表的名称和列。

我需要全局可变状态来保存属性中 struct 的名称和字段,以便过程宏可以检查所有标识符是否存在。

最佳答案

lazy_static!宏可以帮助全局初始化器不是静态的。 https://crates.io/crates/lazy_static/它的作用类似于您的 if hash_map == 0 as *mut HashSet<String> ,但会处理数据竞争,以防多个线程同时尝试执行此操作。

至于可变性,为了避免更多的数据竞争,你必须以某种方式保护它,可能使用 Mutex .

一起:

#[macro_use] extern crate lazy_static;
use std::sync::Mutex;
use std::collections::HashSet;

lazy_static! {
static ref THINGS: Mutex<HashSet<String>> = Mutex::new(HashSet::new());
}

fn usage() {
// unwrap only fails if the lock is poisoned:
// if another thread panicked while holding the lock.
THINGS.lock().unwrap().insert("thing".to_owned())
}

关于rust - 有没有一种干净的方法可以在 Rust 插件中拥有全局可变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32555589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com