使用宏迭代器语法创建向量

发布于 2025-01-13 17:14:39 字数 482 浏览 1 评论 0原文

如何使用迭代器 Rust 宏语法创建新向量?

我正在尝试这样做:

unsafe { 
    MUT_STATIC_VAR = vec![
       #(#my_outher_vector_data)*,
    ];
}

完整的解释:我正在尝试重新分配我在类型为:Vec 的一个 mut static var 中编写的数据,当宏在编译时跨越时。当我尝试在运行时检索数据时,全局数据是空的,因此我在 main() 中重新连接我想要的数据。

回顾一下。我只想将一个向量的内容分配给另一个向量,但 arrayVec 都没有实现 ToTokens

编译错误:

`main` function not found in crate `my_crate`

谢谢

How can I create a new vector with the iterator Rust macro syntax?

I am trying this:

unsafe { 
    MUT_STATIC_VAR = vec![
       #(#my_outher_vector_data)*,
    ];
}

Full explanation: I am trying to reasign data that I write in one mut static var of type: Vec when the macro it's spanded at compile time. When I try to retrieve the data at runtime, the global it's empty, so I am rewiring the data that I want in main().

Recap. I am just want to assign the content of one vector to another, but neither array or Vec<T> implements ToTokens.

Compiler error:

`main` function not found in crate `my_crate`

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

毁梦 2025-01-20 17:14:40

我认为 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 后耗尽其他 vec:

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

...或 my_other_vector_data 包裹在 other_vec!< /代码> 宏:
游乐场

macro_rules! other_vec {
    () => {
        vec!["dog", "cat", "mouse"] // my_other_vector_data here
    };
}

I think lazy_static should do the job:

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

…or draining the other vec after initializing 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()]);
}

…or my_other_vector_data wrapped in other_vec! macro:
Playground

macro_rules! other_vec {
    () => {
        vec!["dog", "cat", "mouse"] // my_other_vector_data here
    };
}
峩卟喜欢 2025-01-20 17:14:39

要初始化内容,迭代器 可以使用宏#(#...)*, 语法。

let other_as_iter = my_outher_vector_data.iter();


quote {
    unsafe { 
        MUT_STATIC_VAR = vec![
           #(#other_as_iter)*,
        ];
    }
}

To initialize the content, Iterators are able to use macro #(#...)*, syntax.

let other_as_iter = my_outher_vector_data.iter();


quote {
    unsafe { 
        MUT_STATIC_VAR = vec![
           #(#other_as_iter)*,
        ];
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文