微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从 Rust 中的不同模块填充静态数组?

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

这就是我想要实现的:

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

这是我的初稿,无效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 旨在收集结构、函数、特征等内容,因此如果您希望它们“做”某事,您需要在函数调用中使用它。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。