2016-08-07 11 views
1

Rustマクロで引数を複数回使用することはできますか?引数を一度インスタンス化するだけですか? 単一インスタンシエーションでRustマクロで引数を複数回使用することはできますか?

は、この単純な例を見てみましょう:

macro_rules! squared { 
    ($x:expr) => { 
     $x * $x 
    } 
} 

を、これは動作しますが、squared!(some_function() + 1)のように呼び出された場合、関数が複数回呼び出されます。これを避ける方法はありますか?

非作業例:

macro_rules! squared { 
    ($x:expr) => { 
     let y = $x; 
     y * y 
    } 
} 

は、コンパイルエラーを与える:

error: expected expression, found statement (`let`) 
+0

あなたの質問を「編集」して、あなたの例が「非機能」である理由を説明できますか? [それは私のために働くようだ](https://play.rust-lang.org/?gist=9f89d79b921d6036998e2cabc267c740)。 – Shepmaster

+0

注目のエラーです。 – ideasman42

+0

2番目のマクロを表示した2番目のリンクをクリックしましたか? 2番目のマクロをどのように呼び出して失敗するかを示すために質問を編集できますか?おそらく、あなたは[遊び場で何かを作成して](https://play.rust-lang.org)でも完全にエラーを再現することができますか? Stack Overflowに関する質問をするときに[MCVE]を作成することが100%期待されています。 – Shepmaster

答えて

3

はい、あなただけの表現を含むように括弧の余分なセットを逃しています。このマクロは唯一Copyを実装する型を持つ式のために働くだろうということ

macro_rules! squared { 
    ($x:expr) => {{ 
     let y = $x; 
     y * y 
    }} 
} 

は注意してください。

関連する問題