给定一个struct
Foo
:
struct Foo<'a> {
info: &'a str
}
要创建一个包含不同字符串的 Foo
的 array
,我想要一个宏,可以像这样使用:
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
需要 -
PartialEq
和Debug
assert_eq!()
需要
我认为宏本身很容易理解:它只是在内部使用数组初始化器。
But how to get exactly the behavior asked in the question?
不要使用宏,也不要使用固定大小的数组。正常功能和Vec<T>
可能没问题。您可以当然也可以编写一个编译器插件,但这些插件目前还不稳定,而且可能不值得这么麻烦。
关于macros - 如何创建宏来创建结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930124/