macros - 如何创建宏来创建结构数组?

标签 macros rust

给定一个struct Foo:

struct Foo<'a> {
    info: &'a str
}

要创建一个包含不同字符串的 Fooarray,我想要一个宏,可以像这样使用:

assert_eq!(make_foo!("test"; 2), [Foo { info: "test 1" }, Foo { info: "test 2" }]);

我特别困惑的是如何迭代第二个参数中指定的特定次数。

最佳答案

目前,据我所知,不可能创建一个完全如您所愿的宏。这只是一种可能。我会解释:

  • 首先,有 no way to count with macros ,所以你不能自己做“重复 n 次”。这就是您无法生成字符串 "test 1" 的原因, "test 2"等等。这只是不可能。但是,您可以创建一个仅包含 "test" 的结构数组。使用标准数组初始值设定项作为字符串 [val; n] .
  • 其次,为了使用数组初始值设定项,数组中的类型必须是Copy。 .但在您的情况下,这不是什么大问题,因为您的结构可以派生它。

那么让我们看看我们能做什么(playground):

#[derive(Clone, Copy, PartialEq, Debug)]
struct Foo<'a> {
    info: &'a str
}

macro_rules! make_foo {
    ($info:expr; $num:expr) => {
        [Foo { info: $info }; $num]
    }
}

首先,我们需要为您的结构派生出一些特征:

  • Copy , 见上文
  • Clone Copy 需要
  • PartialEqDebug assert_eq!() 需要

我认为宏本身很容易理解:它只是在内部使用数组初始化器。


But how to get exactly the behavior asked in the question?

不要使用宏,也不要使用固定大小的数组。正常功能和Vec<T>可能没问题。您可以当然也可以编写一个编译器插件,但这些插件目前还不稳定,而且可能不值得这么麻烦。

关于macros - 如何创建宏来创建结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930124/

相关文章:

从不同文件调用时,C++ __TIME__ 是不同的

c++ - round_down 宏需要解释

c# - C# 中类似宏的结构 ==OR== 如何提取包含 'return' 的函数

macros - 如何将 Rust 宏变量嵌入到文档中?

functional-programming - 如何在不创建闭包的情况下调用多参数函数?

rust - 访问 impl 模块时出现 "use of undeclared type or module"

Rust:为 usize、u64、u32 等实现 From<_>

C 宏 : how do I concatenate a name and a number which is result of a math operation (done also by preprocessor)?

rust - 为什么没有为明确实现的类型实现特征?

python - 在 rust-cpython 中将 Rust 结构转换为 PyObject