私はX
のマクロ内で定義されたm!
の間で "衛生"が衝突するのを防ぐと思っていましたが、そうでないことが判明しました。私は何を誤解していますか?なぜマクロ衛生は複数のconst定義間の衝突を防ぎませんか?
macro_rules! m {
($e:expr) => {
const X: i32 = $e;
}
}
m!(0);
m!(1);
fn main() {
m!(2);
m!(3);
}
エラーメッセージ:https://doc.rust-lang.org/book/macros.html#hygieneから
<anon>:3:9: 3:27 error: duplicate definition of value `X` [E0428]
<anon>:3 const X: i32 = $e;
^~~~~~~~~~~~~~~~~~
<anon>:8:1: 8:7 note: in this expansion of m! (defined in <anon>)
<anon>:3:9: 3:27 help: see the detailed explanation for E0428
<anon>:3:9: 3:27 note: first definition of value `X` here
<anon>:3 const X: i32 = $e;
^~~~~~~~~~~~~~~~~~
<anon>:7:1: 7:7 note: in this expansion of m! (defined in <anon>)
<anon>:3:9: 3:27 error: duplicate definition of value `X` [E0428]
<anon>:3 const X: i32 = $e;
...snip...
ありがとうございました。それは設計によるものです。 "あなたが実際にそれを使用したいと思うマクロに商品を紹介したら、"さて、それは衛生的なマクロシステムとして宣伝されているものを使う方法ではないと思います... – nodakai
@nodakai申し訳ありませんが、私は "外でしたマクロ "があります。あなたの場合、 'println!(" X = {} "、X);を最後の' m!(3) 'の後に置けば、何を印刷すると思いますか? –
私はRustマクロが衛生的であると聞いたとき、私は "未知の変数X"のエラーを予想します。 – nodakai