Değerleri Eşleştirmek
match
anahtar kelimesi, bir değeri bir veya daha fazla desene (pattern) göre eşleştirmenizi sağlar. Desenler, C ve C++’daki switch
’e benzer şekilde basit değerler olabilir, ancak daha karmaşık koşulları ifade etmek için de kullanılabilirler:
#[rustfmt::skip] fn main() { let input = 'x'; match input { 'q' => println!("Çıkılıyor"), 'a' | 's' | 'w' | 'd' => println!("Etrafta hareket ediliyor"), '0'..='9' => println!("Sayı girişi"), key if key.is_lowercase() => println!("Küçük harf: {key}"), _ => println!("Başka bir şey"), } }
Desendeki bir değişken (bu örnekte key
) eşleşme kolu (match arm) içinde kullanılabilecek bir bağlama (binding) oluşturacaktır. Bunu bir sonraki slaytta daha ayrıntılı öğreneceğiz.
Bir eşleşme filtresi (match guard), kolun yalnızca koşul doğruysa eşleşmesine neden olur. Koşul yanlışsa, eşleşme daha sonraki durumları kontrol etmeye devam edecektir.
Önemli Noktalar:
-
Bir desendeyken bazı özel karakterlerin nasıl kullanıldığına dikkat edin
|
birveya (or)
olarak..
gerektiği kadar genişleyebilir1..=5
kapsayıcı bir aralığı (inclusive range) temsil eder_
bir joker karakterdir
-
Ayrı bir sözdizimi özelliği olarak eşleşme filtreleri (match guards), tek başına desenlerin izin verdiğinden daha karmaşık fikirleri kısaca ifade etmek istediğimizde önemli ve gereklidir.
-
Bunlar, eşleşme kolunun (match arm) içindeki ayrı bir
if
ifadesiyle aynı değildir. Dal (branch) bloğunun içindeki birif
ifadesi (=>
’dan sonra), eşleşme kolu seçildikten sonra gerçekleşir. O bloğun içindekiif
koşulunun başarısız olması, orijinalmatch
ifadesinin diğer kollarının dikkate alınmasıyla sonuçlanmaz. -
Filtrede tanımlanan koşul, bir
|
içeren bir desendeki her ifade için geçerlidir. -
Bir eşleşme kolunda (match arm) mevcut bir değişkeni koşul olarak kullanamayacağınızı unutmayın, çünkü bunun yerine bir değişken adı deseni olarak yorumlanacaktır, bu da mevcut olanı gölgeleyecek (shadow) yeni bir değişken oluşturur. Örneğin:
#![allow(unused)] fn main() { let expected = 5; match 123 { expected => println!("Beklenen değer 5, gerçek değer {expected}"), _ => println!("Değer başka bir şeydi"), } }
Burada 123 sayısıyla eşleştirmeye çalışıyoruz, ilk durumun değerin 5 olup olmadığını kontrol etmesini istiyoruz. Saf beklenti, değer 5 olmadığı için ilk durumun eşleşmeyeceğidir, ancak bunun yerine bu, her zaman eşleşen bir değişken deseni olarak yorumlanır, yani her zaman ilk dal alınacaktır. Bunun yerine bir sabit (constant) kullanılırsa bu beklendiği gibi çalışacaktır.
Daha Fazlasını Keşfedin
-
Öğrencilere gösterebileceğiniz başka bir desen sözdizimi parçası, bir desenin bir bölümünü bir değişkene bağlayan
@
sözdizimidir. Örneğin:#![allow(unused)] fn main() { let opt = Some(123); match opt { outer @ Some(inner) => { println!("dış: {outer:?}, iç: {inner}"); } None => {} } }
Bu örnekte
inner
, çözümleme (destructuring) yoluylaOption
’dan çektiği 123 değerine sahiptir,outer
ise tümSome(inner)
ifadesini yakalar, bu nedenle tamOption::Some(123)
’ü içerir. Bu nadiren kullanılır ancak daha karmaşık desenlerde faydalı olabilir.