【发布时间】:2016-02-18 12:29:27
【问题描述】:
我想创建一个打印“Hello”指定次数的宏。它的用法如下:
many_greetings!(3); // expands to three `println!("Hello");` statements
创建该宏的简单方法是:
macro_rules! many_greetings {
($times:expr) => {{
println!("Hello");
many_greetings!($times - 1);
}};
(0) => ();
}
但是,这不起作用,因为编译器不计算表达式; $times - 1 不是计算出来的,而是作为新表达式输入到宏中。
【问题讨论】:
-
你能得到的最接近的是递归,利用事实匹配被重新评估:is.gd/3QfTr9 虽然它很丑。
-
如果您能说明为什么在宏中使用
for循环不是一个好的解决方案(因为这似乎是一个显而易见的答案),那就太好了。 -
@ideasman42 这是一个人为的例子。我对这个特定的用例并不感兴趣;问题是关于“用宏计数”的一般情况。
-
好的,在这种情况下,很难知道什么是好的答案,因为在示例中你很明显你会使用迭代。请注意,这个问题的标题与另一个问题非常相似:stackoverflow.com/questions/30152800(我在寻找什么以及为什么我偶然发现了这个页面)。 AFAICS 是关于宏扩展,而不是计数。
-
@ideasman42 为非
Copy元素(例如,String)或任何类型的 n > 32 个元素构建一个数组初始化器是一个用例,其中for是不合适。例如:static FOO: [AtomicUsize; 100] = arr_init![AtomicUsize::new(0); 100];。arr_init!宏应在编译时发出[AtomicUsize::new(0), AtomicUsize::new(0), ... , AtomicUsize::new(0) ](n = 100 个元素)。
标签: macros rust rust-macros