這種極其簡單的防鏽方案:println!錯誤:預期文字/格式參數必須是一個字符串文字
fn main() {
let c = "hello";
println!(c);
}
拋出以下編譯時錯誤:
error: expected a literal
--> src/main.rs:3:14
|
3 | println!(c);
| ^
生鏽的早期版本中,錯誤說:
:error: format argument must be a string literal.
println!(c);
^
與更換計劃
fn main() {
println!("Hello");
}
工作正常。
這個錯誤的含義對我來說並不清楚,谷歌搜索也沒有真正揭示它。爲什麼將c
傳遞給println!
宏會導致編譯時錯誤?這似乎很不尋常的行爲。
爲什麼編譯時不可能知道c在編譯時是從字面上來的? –
我認爲真正的問題是,如果'c =「{}」'和宏在編譯時被解析,那麼編譯器確實很難確定它是否會有更多的參數被預期,所以驗證不會在編譯時無法保證... – evotopid
我認爲這不是不可能*永遠*,現在只是宏如何實現。宏採取[部分AST](http://doc.rust-lang.org/guide-macros.html),我認爲它只有類型信息。你的問題將涉及知道類型的來源和足夠的信息,以確定它的「安全」。另外,它可能與類型推斷相互作用不佳 - 你想知道它在被選中之前的類型! – Shepmaster