从 Rust 中的不同模块填充静态数组?
Filling a static array from different modules in Rust?
在我的 Rust 项目中,我需要一个全局保存的静态数组或 vec,它被初始化一次,模块可以在其中注册值或函数。我想,这可以使用 lazy_static!-crate,但似乎并非如此。
这就是我想要实现的:
- 模块
a
使用一些数据初始化 array/vec。
- 模块
b
(或更多模块)然后将此 array/vec 扩展到更多数据。
- 所有这些只应在程序启动时执行一次,并且在程序执行期间不会修改数组。它只是一个查找-table,全局持有,但一旦从多个模块创建。
这是我的初稿,没有用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' 某些内容,则需要在函数调用中包含它。
综上所述,希望这段代码能帮到您。
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());
}
在我的 Rust 项目中,我需要一个全局保存的静态数组或 vec,它被初始化一次,模块可以在其中注册值或函数。我想,这可以使用 lazy_static!-crate,但似乎并非如此。
这就是我想要实现的:
- 模块
a
使用一些数据初始化 array/vec。 - 模块
b
(或更多模块)然后将此 array/vec 扩展到更多数据。 - 所有这些只应在程序启动时执行一次,并且在程序执行期间不会修改数组。它只是一个查找-table,全局持有,但一旦从多个模块创建。
这是我的初稿,没有用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' 某些内容,则需要在函数调用中包含它。
综上所述,希望这段代码能帮到您。
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());
}