Makro Parçacık Belirteçleri
Özet
exprparçacık belirteci artıkconstve_ifadelerini de destekler.- Geriye dönük uyumluluk için
expr_2021parçacık belirteci eklendi.
Ayrıntılar
Rust’a yeni sözdizimleri eklendikçe, geriye dönük uyumluluğu korumak için mevcut
macro_rules parçacık belirteçlerinin bu yeni sözdizimiyle eşleşmesine bazen
izin verilmez. Eski belirteçlerin yeni sözdizimini desteklemesi kimi zaman
bir sonraki sürüme ertelenir; bu da onları güncelleme fırsatı yaratır.
Nitekim bu durum, 1.79’da gelen const ifadeleri ve 1.59’da gelen
_ ifadeleri için yaşandı. 2021 sürümünde ve daha eski sürümlerde
expr parçacık belirteci bu ifadelerle eşleşmez. Çünkü şöyle bir senaryo olabilir:
macro_rules! example {
($e:expr) => { println!("ilk kural"); };
(const $e:expr) => { println!("ikinci kural"); };
}
fn main() {
example!(const { 1 + 1 });
}
Burada 2021 sürümünde makro ikinci kuralla eşleşir. Eğer daha eski sürümlerde
expr, yeni gelen const ifadeleriyle de eşleşecek şekilde değiştirilmiş olsaydı,
makro ilk kuralla eşleşirdi ve bu kırıcı bir değişiklik olurdu.
2024 sürümünde expr belirteçleri artık const ve _ ifadeleriyle de eşleşir.
Eski davranışı desteklemek için, bu yeni ifadelerle eşleşmeyen expr_2021
parçacık belirteci eklendi.
Taşıma
edition_2024_expr_fragment_specifier lint’i, mevcut makroların davranışı
değişmesin diye expr belirtecinin tüm kullanımlarını expr_2021e çevirir.
Bu lint, otomatik sürüm taşımasına dahil olan rust-2024-compatibility lint
grubunun parçasıdır. Kodunuzu Rust 2024 ile uyumlu hale getirmek için şunu çalıştırın:
cargo fix --edition
Çoğu durumda, yeni ifadeleri desteklemek için muhtemelen expr belirtecini
korumak istersiniz. Bunun için makronuzu gözden geçirip const ya da _
ile eşleşebilecek başka kurallar bulunup bulunmadığını ve çatışma olup olmadığını
kontrol etmeniz gerekir. Yeni davranışı istiyorsanız lint’in yaptığı değişiklikleri geri alın.
Alternatif olarak, expr belirtecini güncellemeniz gerekebilecek makroları
bulmak için lint’i elle etkinleştirebilirsiniz.
#![allow(unused)]
fn main() {
// Elle taşıma yapmak için bunu crate köküne ekleyin.
#![warn(edition_2024_expr_fragment_specifier)]
}