你能编写一个宏来调用rust中的default()运算符吗?

时间:2014-03-24 06:11:09

标签: rust

类似的东西:

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(),但在某些情况下这看起来很不错)

1 个答案:

答案 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),*)
    };
)

正如您所看到的,有两种模式,第一个匹配对用逗号分隔,第二个用冒号分隔。