macro-rules İçinde Or Desenleri
Özet
- Desenlerin
macro_rulesmakroları içinde çalışma biçimi biraz değişiyor:macro_rulesiçindeki$_:patartık|kullanımını da eşleştirir; örneğinA | B.- Yeni
$_:pat_param, eskiden$_:patnasıl davranıyorsa öyle davranır; üst düzey|ile eşleşmez. $_:pat_paramtü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
}
}
}