2017-01-17 15 views
3

場合によっては、何らかのテキスト、またはのないマクロに引数を渡したい場合があります。(何も書かれていないかのように空白が入ります)。我々はvar随意には、マクロ全体を複製するのではなく、マクロ本体は、上記の例では、次に大きい最高と仮定して、可変とすることが必要かもしれ空白/空の引数をRustのマクロに渡すにはどうすればよいですか?

macro_rules! testme { 
    ($var:ident, $code:block) => { 
     for i in 0..10 { 
      let $var = i; 
      { $code } 
      if $var > 5 { 
       println!("over 5"); 
      } 
     } 
    } 
} 

fn main() { 
    testme!(myvar, { 
     println!("{}", myvar); 
    }); 

} 

この出発点を与えられます。

macro_rules! testme { 
    (private $var:ident, $code:block, $var_qual:tt) => { 
     for i in 0..10 { 
      // imagine this is a lot more code :) 
      let $var_qual $var = i; 
      { $code } 
      if $var > 5 { 
       println!("over 5"); 
      } 
     } 
    }; 
    (mut $var:ident, $code:block) => { 
     testme!(private $var, $code, mut) 
    }; 
/* 
    ($var:ident, $code:block) => { 
     testme!(private $var, $code,) 
     //      ^how to pass in a blank argument? 
    }; 
*/ 
} 

fn main() { 
    testme!(mut myvar_mut, { 
     myvar_mut += 10; 
     println!("{}", myvar_mut); 
    }); 
/* 
    testme!(myvar_immutable, { 
     println!("{}", myvar_immutable); 
    }); 
*/ 
} 

は、私の知る限り、空の引数を渡す方法はありません、エラーを参照してください/**/コメントコメントを解除します。


空の引数をマクロに渡して、このような例を作ることはできますか?

+0

なぜそれが欲しいですか?テキスト入力の場合は、何もせずに空の文字列にすることができます。 – ljedrz

+0

@ljedrz、Textは全く異なるケースです。これはオプションの*キーワード*です。そのため引数として渡すのは簡単ではありません。私はイテレータとして動作し、宣言する変数の名前をとるマクロを使用しています。これは変更可能である必要がありますか?元のコードへのリンクを投稿できますが、必要がないかどうかはわかりません。 – ideasman42

+0

ナー、私は今それを見ることができます。私はマクロに頼るのに慣れていないと思います。普通のコードとはまったく異なる種類の問題です。 – ljedrz

答えて

2

私が知っている限り、空白/空の引数を渡すことはできません。

ローカルに定義されたマクロを渡すことは可能ですが、オプションでプレフィックスを追加します。

の作業例:マクロ(この場合はvar_qualifier)での名前は名前がされるので、別のマクロ内で使用したのと同じ名前ではないことを、このようなマクロを入れ子に

macro_rules! testme { 
    (private $var:ident, $code:block, $var_qual_macro:ident) => { 
     for i in 0..10 { 
      // imagine this is a lot more code :) 
      let $var_qual_macro!($var) = i; 
      { $code } 
      if $var > 5 { 
       println!("over 5"); 
      } 
     } 
    }; 
    (mut $var:ident, $code:block) => { 
     macro_rules! var_qualifier { ($v:ident) => { mut $v } } 
     testme!(private $var, $code, var_qualifier) 
    }; 
    ($var:ident, $code:block) => { 
     macro_rules! var_qualifier { ($v:ident) => { $v } } 
     testme!(private $var, $code, var_qualifier) 
    }; 
} 

fn main() { 
    testme!(mut myvar_mut, { 
     myvar_mut += 10; 
     println!("{}", myvar_mut); 
    }); 
    testme!(myvar_immutable, { 
     println!("{}", myvar_immutable); 
    }); 
} 

世話黙って陰になった。

関連する問題