假設我有一個如下功能:
fn log(msg: &str) {
//fancy_output
println!("{}", msg)
}
現在,如果我想使用該函式記錄一個變數,我必須這樣做:
let x = 5;
log(&format!("{:?}", x)); // Assume some complex data type which implements Debug
顯然,這是很多樣板。我可以&通過將引數設為字串來洗掉,但這并不能解決我更大的問題:format!()到處使用。
如何撰寫函式/宏,以便可以執行以下操作或類似操作:
let x = 5;
log("{:?}", x) // Assume some complex data type which implements Debug
我知道一個起點是查看format!源代碼,但是對于像我這樣的初學者以及如何在這里實作它來說很難理解。
我是使用一些花哨的宏還是有更簡單的方法?
uj5u.com熱心網友回復:
format!是一個宏,而不是一個函式,這就是為什么它能夠處理可變數量的引數。你可以用這樣的宣告性宏來做同樣的事情:
macro_rules! log {
($($args: tt)*) => {
println!($($args)*);
}
}
這$($args: tt)*意味著宏接受零個或多個 ( *) 任何型別的標記 ( tt)。然后它只是將這些傳遞給println宏。
你可以這樣稱呼它:
fn main() {
let x = 5;
log!("{:?}", x);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520258.html
標籤:细绳日志记录锈宏
上一篇:根據單詞在dart中給定字串中的位置對單詞串列進行排序
下一篇:從字串生成資料框
