"Hijyen", X
arasındaki makroların m!
benim makrolarımdaki çarpışmaları önleyeceğini düşündüm ama durum böyle olmadı. Neyi yanlış anladım?Makro hijyen, çoklu const tanımları arasındaki çarpışmaları neden engellemez?
macro_rules! m {
($e:expr) => {
const X: i32 = $e;
}
}
m!(0);
m!(1);
fn main() {
m!(2);
m!(3);
}
hata iletisi:
<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...
Teşekkürler. Yani tasarım gereği. “Makroda bir öğeyi tanıtıyorsanız, muhtemelen bunu kullanmak istersiniz”, sanırım bu, hijyenik bir makro sistem olarak tanıtılan şeyi kullanmamız gerektiği anlamına gelmez ... – nodakai
@nodakai Üzgünüz, dışarıda kaldım Makro "orada. Sizin durumunuzda, println! ("X = {}", X); 'son 'm! (3)' den sonra, ne yazmasını beklersiniz? –
Pas makrolarının hijyenik olduğunu duyduğumda "bilinmeyen değişken X" hatası beklerdim. – nodakai