从 Rust 中的不同模块填充静态数组?

Filling a static array from different modules in Rust?

在我的 Rust 项目中,我需要一个全局保存的静态数组或 vec,它被初始化一次,模块可以在其中注册值或函数。我想,这可以使用 lazy_static!-crate,但似乎并非如此。

这就是我想要实现的:

这是我的初稿,没有用playground link

mod a
{
    use lazy_static::lazy_static; // 1.4.0

    lazy_static!{
        #[derive(Debug)]
        pub static ref TEST: Vec<u32> = vec![1, 2, 3];
    }
}

mod b  // when module b is removed, it works. 
{
    use lazy_static::lazy_static; // 1.4.0
    use crate::a::TEST;

    lazy_static!{
        TEST.extend(vec![4, 5, 6]);
    }
}

use a::TEST;

fn main() {
    for i in 0..TEST.len() {
        println!("{}", TEST[i]);
    }
}

有人可以帮忙吗?

有几点需要注意:

  • 据我所知,lazy_static! 用于声明静态变量,因此 mod b 不能仅使用宏来改变其他静态变量,就像您在示例中尝试的那样
  • 要使 Rust 中的静态变量可变,您需要将它们包装在 Mutex 中以遵循 Rust 的整个线程安全保证
  • modules 旨在收集结构、函数、特征等内容,因此如果您希望它们 'do' 某些内容,则需要在函数调用中包含它。

综上所述,希望这段代码能帮到您。

Rust Playground

mod a {
    use lazy_static::lazy_static; // 1.4.0
    use std::sync::Mutex;

    lazy_static!{
        #[derive(Debug)]
        pub static ref TEST: Mutex<Vec<u32>> = Mutex::new(vec![1, 2, 3]);
    }
}

mod b {
    use crate::a::TEST;
    
    pub fn append_to_test() {
        TEST.lock().unwrap().extend(vec![4, 5, 6]);
    }
}

use a::TEST;

fn main() {
    crate::b::append_to_test();
    
    println!("{:?}", TEST.lock().unwrap());
}