1

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

这就是我想要实现的目标:

  • 模块a用一些数据初始化一个数组/向量。
  • 然后模块b(或更多模块)将此数组/vec 扩展为更多数据。
  • 所有这些都应该只在程序启动时完成一次,并且在程序执行期间不会修改数组。它只是一个全局保存的查找表,但曾经由多个模块创建。

这是我的初稿,它不起作用游乐场链接

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]);
    }
}

有人可以帮忙吗?

4

1 回答 1

2

有几点需要注意:

  • 据我所知,lazy_static!是用于声明静态变量,所以mod b不能使用宏来改变其他静态变量,就像你在你的例子中尝试的那样
  • 为了在 Rust 中静态变量是可变的,您需要将它们包装在 aMutex中以遵循 Rust 保证线程安全的全部内容
  • modules旨在收集诸如结构,函数,特征等之类的东西,因此如果您希望它们“做”某事,则需要在函数调用中使用它。

说了这么多,我希望这个片段可以帮助你。

锈游乐场

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());
}
于 2021-07-17T01:57:04.273 回答