如何解决从 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
旨在收集结构、函数、特征等内容,因此如果您希望它们“做”某事,您需要在函数调用中使用它。
说了这么多,我希望这个片段可以帮助你。
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 举报,一经查实,本站将立刻删除。