类似的东西:
macro_rules! default(
($T:ty, $($args:expr)*) => (
$T { $($args)*, ..Default::default() };
);
)
...但是使用魔法类型而不是expr,所以你可以做类似的事情:
let p = default!(CItem, _z: ~"Hi2", x: 10);
let q = default!(CItem, _z, ~"Hi2", x, 10);
let r = default!(CItem, { _z: ~"Hi2", x: 10 });
或者沿着这些方向做什么?
是否有任何宏符号只是在没有先将其解析为类型/ expr / etc的情况下获取文字字符块?
(我意识到你通常只是写一个CItem :: new(),但在某些情况下这看起来很不错)
答案 0 :(得分:2)
宏可以有多种模式来匹配语法,所以你必须为每个案例分别编写一个单独的模式:
macro_rules! default(
($t:ident, $($n:ident, $v:expr),*) => {
$t { $($n: $v),*, ..Default::default() }
};
($t:ident, $($n:ident: $v:expr),*) => {
default!($t, $($n, $v),*)
};
)
正如您所看到的,有两种模式,第一个匹配对用逗号分隔,第二个用冒号分隔。