static - 将数据解析为模块级可变静态变量

标签 static rust mutability

我在一个模块中有一组函数需要访问一些共享的初始化时状态。实际上,我想用静态可变向量对此进行建模,例如:

static mut defs: Vec<String> = vec![];

fn initialize() {
    defs.push("One".to_string());
    defs.push("Two".to_string()); 
}

(示例:http://is.gd/TyNQVv,失败并显示“可变静态不允许具有析构函数”。)

我的问题类似于Is it possible to use global variables in Rust? ,但使用 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);
}
  1. 有没有办法访问在初始化时填充并在运行时可见的静态(“全局”)向量?

  2. 我是否应该考虑其他模式来支持此用例?传递对状态向量的显式引用是可能的,但会使大量需要访问此状态的函数签名变得困惑。

最佳答案

您可以使用 lazy_static为此目的:

lazy_static! {
    static ref defs: Vec<String> = {
        let mut init = vec!["One".to_string(), "Two".to_string()];
        // init.push(...); etc. etc.
        init
    }
}

在第一次访问时初始化一个向量,之后它是不可变的。如果您希望稍后修改它,将它包装在 std::sync::Mutex 中是很好的第一步。

Are there other patterns I should be considering to support this use case? Passing explicit references to the state vector is possible, but would clutter up a very large number of function signatures that all need access to this state.

要考虑的一种模式是创建一个上下文对象来存储函数所需的所有信息,例如

struct Context {
    defs: Vec<String>
}

然后传递 Context 确保每个人都知道他们需要知道的内容。您甚至可以考虑将所有/许多/部分功能作为方法放在 Context 上,例如

impl Context {
    fn foo(&self) {
        if self.defs.len() > 10 {
             println!("lots of defs");
        }
    }
    // ...
}

如果您需要修改上下文(自动确保线程安全),和/或如果您希望在单个进程中拥有多个独立实例,则此模式特别有用。

关于static - 将数据解析为模块级可变静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824992/

相关文章:

common-lisp - 为什么用这种方法将列表改变为它的第一个元素在 Common Lisp 中不起作用?

泛型上的 Java 静态函数

rust - Vec<MyTrait> 没有 N 堆分配?

rust - 有没有一种跨平台的方法来检查stdout是否通过管道传递到Rust中的另一个程序中?

enums - 如何在 Rust 中参数化枚举器?

rust - 当 self 可变时返回可变引用,否则引用

java - 更改嵌套循环中静态类变量的值

c++ - 从我的对象返回静态数组

java - 自动调用静态 block ,无需显式调用 Class.forName

rust - 为什么给定 HashMap 中的值是可变的,而我不认为我已经明确声明了它们?