Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Makro Parçacık Belirteçleri

Özet

  • expr parçacık belirteci artık const ve _ ifadelerini de destekler.
  • Geriye dönük uyumluluk için expr_2021 parç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)]
}