Bos*_*osh 7 static mutability rust
我在模块中有一组需要访问某些共享初始化时间状态的函数.实际上,我想用静态可变矢量来模拟这个:
static mut defs: Vec<String> = vec![];
fn initialize() {
defs.push("One".to_string());
defs.push("Two".to_string());
}
Run Code Online (Sandbox Code Playgroud)
(示例:http://is.gd/TyNQVv,失败,"可变静态不允许有析构函数".)
我的问题类似于是否可以在Rust中使用全局变量?,但使用a Vec(即带有析构函数的类型),因此Option基于该问题的解决方案似乎不适用.也就是说,这失败的错误与我的第一次尝试相同:
static mut defs: Option<Vec<String>> = None;
fn initialize() {
let init_defs = vec![];
init_defs.push("One".to_string());
init_defs.push("Two".to_string());
defs = Some(init_defs);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法访问在初始化时填充并在运行时可见的静态("全局")向量?
是否有其他模式我应该考虑支持这个用例?传递对状态向量的显式引用是可能的,但会混乱大量的函数签名,这些函数签名都需要访问此状态.
huo*_*uon 11
您可以lazy_static为此目的使用:
lazy_static! {
static ref defs: Vec<String> = {
let mut init = vec!["One".to_string(), "Two".to_string()];
// init.push(...); etc. etc.
init
}
}
Run Code Online (Sandbox Code Playgroud)
这在第一次访问时初始化一个向量,之后它是不可变的.如果您希望稍后修改它,将其包装在一个std::sync::Mutex是一个很好的第一步.
是否有其他模式我应该考虑支持这个用例?传递对状态向量的显式引用是可能的,但会混乱大量的函数签名,这些函数签名都需要访问此状态.
要考虑的一种模式是创建一个上下文对象,它存储函数所需的所有信息,例如
struct Context {
defs: Vec<String>
}
Run Code Online (Sandbox Code Playgroud)
然后路过,Context确保每个人都知道他们需要知道什么.您甚至可以考虑将所有/许多/某些功能作为方法Context,例如
impl Context {
fn foo(&self) {
if self.defs.len() > 10 {
println!("lots of defs");
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您需要修改上下文(自动确保线程安全),和/或您希望在单个进程中拥有多个独立实例,则此模式特别好.
| 归档时间: |
|
| 查看次数: |
2151 次 |
| 最近记录: |