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

macro-rules İçinde Or Desenleri

Özet

  • Desenlerin macro_rules makroları içinde çalışma biçimi biraz değişiyor:
    • macro_rules içindeki $_:pat artık | kullanımını da eşleştirir; örneğin A | B.
    • Yeni $_:pat_param, eskiden $_:pat nasıl davranıyorsa öyle davranır; üst düzey | ile eşleşmez.
    • $_:pat_param tüm sürümlerde kullanılabilir.

Ayrıntılar

Rust 1.53.0’dan itibaren desenler, desenin herhangi bir yerinde iç içe | kullanımını destekleyecek şekilde genişletildi. Böylece Some(1) | Some(2) yerine Some(1 | 2) yazabiliyorsunuz. Bu kullanım daha önce zaten geçerli olmadığı için kırıcı bir değişiklik değildir.

Ancak bu değişiklik macro_rules makrolarını da etkiler. Bu makrolar, :pat parçacık belirteci ile desen kabul edebilir. Şu anda :pat, üst düzey | ile eşleşmez; çünkü Rust 1.53 öncesinde tüm desenler, her iç içe düzeyde | içeremiyordu. A | B gibi desenleri kabul eden matches!() gibi makrolar bu yüzden $($_:pat)|+ benzeri biçimler kullanır.

Bu değişiklik mevcut makroları bozabileceği için :patin anlamı Rust 1.53.0’da | içerecek şekilde değiştirilmedi. Bunun yerine bu değişiklik Rust 2021’de devreye girdi. Yeni sürümde :pat parçacık belirteci A | B ile de eşleşir.

Rust 2021’de $_:pat parçacıklarının ardından açıkça | gelemez. Ancak bazı durumlarda hâlâ ardından | gelen desen parçalarını eşleştirmek istenir. Bu yüzden eski davranışı korumak için :pat_param parçacık belirteci eklendi.

Sürümlerin crate başına uygulandığını unutmamak önemlidir. Dolayısıyla burada önemli olan tek sürüm, makronun tanımlandığı crate’in sürümüdür. Makronun kullanıldığı crate’in sürümü, makronun çalışma biçimini değiştirmez.

Taşıma

rust_2021_incompatible_or_patterns lint’i, Rust 2021’de anlamı değişecek bir $_:pat kullanımı bulunduğunda tetiklenir.

Kodunuzu otomatik olarak Rust 2021 ile uyumlu hale getirmek ya da zaten uyumlu olduğunu doğrulamak için şunu çalıştırabilirsiniz:

cargo fix --edition

Eğer makronuz, $_:patin desenlerde üst düzey | kullanımını eşleştirmemesine güveniyorsa, her $_:pat kullanımını $_:pat_param olarak değiştirmeniz gerekir.

Örneğin:

#![allow(unused)]
fn main() {
macro_rules! benim_makrom { 
	($x:pat | $y:pat) => {
		// YAPILACAK: uygulama
	} 
}

// Bu makro Rust 2018'de çalışır; çünkü `$x:pat`, `|` ile eşleşmez:
benim_makrom!(1 | 2);

// Ancak Rust 2021'de `$_:pat` parçacığı `|` ile eşleşir ve ardından
// bir `|` gelmesine izin verilmez. Bu makronun Rust 2021'de de çalışması için
// aşağıdaki biçime çevirin:
macro_rules! benim_makrom { 
	($x:pat_param | $y:pat) => { // <- bu satır farklı
		// YAPILACAK: uygulama
	} 
}
}