2016-08-07 61 views
1

是否有可能在Rust宏中多次使用參數,只有一次實例化參數?是否有可能在單一instansiation的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

你是否點擊我的第二​​個鏈接,顯示你的第二個宏和事實**,它的作品**?你可以[編輯]你的問題,以顯示你如何調用第二個宏,使其失敗?也許你甚至可以[在操場上創建一些東西](https://play.rust-lang.org)完全重現錯誤?在提出關於堆棧溢出的問題時,您預計會創建一個[MCVE]。 – Shepmaster

回答

3

是的,你只是缺少一個額外的大括號包含的表達式。

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

請注意,該宏只適用於具有實現Copy類型的表達式。

相關問題