この非常に簡単な錆プログラム:錆の以前のバージョンではprintln!エラー:リテラル/フォーマット引数は文字列リテラルでなければならないと予想
error: expected a literal
--> src/main.rs:3:14
|
3 | println!(c);
| ^
、次のコンパイル時にエラーがスローされます
fn main() {
let c = "hello";
println!(c);
}
エラーは言った:
:error: format argument must be a string literal.
println!(c);
^
はしてプログラムを置き換えます
fn main() {
println!("Hello");
}
正常に動作します。
このエラーの意味は私には分かりません.Google検索では実際にそのことを明らかにしていません。 c
をprintln!
マクロに渡すと、コンパイル時にエラーが発生するのはなぜですか?これは非常に珍しい動作のようです。
コンパイル時にcがリテラルから来たことをコンパイル時に知ることがなぜ不可能なのですか? –
本当の問題は、 'c =" {} "'とマクロがコンパイル時に解決された場合、それ以上の引数が期待されるかどうかをコンパイラが確かめるのは本当に難しく、コンパイル時に保証することはできません... – evotopid
私はそれが不可能ではないと思っています*永遠に、ちょうど今マクロがどのように実装されています。マクロは、[ASTの部分](http://doc.rust-lang.org/guide-macros.html)を取っていますが、これは型情報しかないと仮定しています。あなたの質問には、そのタイプの情報源と、それが「安全」であるかどうかを判断するのに十分な情報を知ることが含まれます。さらに、タイプ推論とのやりとりがうまくいかないかもしれません - あなたはまだタイプされていないタイプを知りたいと思っています! – Shepmaster