如何使用迭代器Rust宏语法创建新矢量?
我正在尝试这个:
unsafe {
MUT_STATIC_VAR = vec![
#(#my_outher_vector_data)*,
];
}
完整的解释:当宏在编译时被跨度时,我试图重新设计我在一个类型为Vec的mut静态变量中写入的数据。当我尝试在运行时检索数据时,全局数据是空的,所以我在main()
中重新连接我想要的数据。
回顾。我只是想把一个向量的内容分配给另一个向量,但array
和Vec<T>
都没有实现ToTokens
。
编译器错误:
`main` function not found in crate `my_crate`
感谢
要初始化内容,Iterators
可以使用宏#(#...)*,
语法。
let other_as_iter = my_outher_vector_data.iter();
quote {
unsafe {
MUT_STATIC_VAR = vec![
#(#other_as_iter)*,
];
}
}
我认为lazy_static
应该做这项工作:
#[macro_use]
extern crate lazy_static;
use std::sync::Mutex;
lazy_static! {
static ref MUT_STATIC_VAR: Mutex<Vec<String>> = Mutex::new(vec![]);
}
fn other_vec(v: Vec<String>) {
let mut r = MUT_STATIC_VAR.lock().unwrap();
r.extend_from_slice(v.as_slice());
}
fn main() {
other_vec(vec!["dog".to_string(), "cat".to_string(), "mouse".to_string()]);
}
…或在初始化MUT_STATIC_VAR
:后排出另一个矢量
fn other_vec(v: &mut Vec<String>) {
let mut r = MUT_STATIC_VAR.lock().unwrap();
r.extend_from_slice(v.drain(..).as_slice());
}
fn main() {
other_vec(&mut vec!["dog".to_string(), "cat".to_string(), "mouse".to_string()]);
}
…或封装在other_vec!
宏中的my_other_vector_data
:
Playground
macro_rules! other_vec {
() => {
vec!["dog", "cat", "mouse"] // my_other_vector_data here
};
}