如何创建一个宏来创建一个结构数组?

时间:2016-10-08 07:59:59

标签: macros rust

鉴于 List<Command> commandList = new List<Command>(); Command command1 = new Command("set-adserversettings"); CommandParameter parameter1 = new CommandParameter("viewentireforest", true); command1.Parameters.Add(parameter1); commandList.Add(command1); Command command2 = new Command("set-userphoto"); CommandParameter parameter2a = new CommandParameter("identity", tbxName.Text); CommandParameter parameter2b = new CommandParameter("picturedata", displayedImage); CommandParameter parameter2c = new CommandParameter("domaincontroller", "xx-xx-xx-01.xx.xx.xx.xxx"); CommandParameter parameter2d = new CommandParameter("confirm", false); command2.Parameters.Add(parameter2a); command2.Parameters.Add(parameter2b); command2.Parameters.Add(parameter2c); command2.Parameters.Add(parameter2d); commandList.Add(command2); Pipeline pipeline; Collection<PSObject> exResults = null; foreach (Command cmd in commandList) { pipeline = runspacee.CreatePipeline(); pipeline.Commands.Add(cmd); exResults = pipeline.Invoke(); } struct

Foo

要创建一个内置不同字符串的struct Foo<'a> { info: &'a str } array,我希望有一个宏,可以像以下一样使用:

Foo

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

1 个答案:

答案 0 :(得分:1)

目前,据我所知,不可能创建一个可以按照您的意愿完全的宏。它只有可能。我会解释一下:

  • 首先,有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 {li> PartialEqDebugassert_eq!()
  • 所必需的

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

  

但如何准确了解问题中提出的行为?

不要使用宏,也不要使用固定大小的数组。正常函数和Vec<T>可能很好。你当然可以 编写一个编译器插件,但是现在它们不稳定,无论如何它可能都不值得麻烦。