Rust Pattern ve Matching
Daha önceki yazılarımda Rust dilinde bulunan ve temellerinden bahsetmiştim. Bu yazımda ise Pattern ve Matching konularına değineceğim. Bu kavramlar bize daha esnek yapılar kurmamızda yardımcı olmaktadır.
Rust dilinde hem karmaşık hem de basit türlerin yapısıyla eşleştirmek için kullanılan özelleştirilmiş sözdizimleridir. Kalıpları eşleştirme ifadeleri ve diğer yapılarla birlikte kullanmak, bir programın kontrol akışı üzerinde size daha fazla kontrol sağlar. Bunlar aşağıdakilerin kombinasyonlarından bazılarından oluşmaktadır.
- Literals
- Destructured arrays, enums, structs, or tuples
- Variables
- Wildcards
- Placeholders
Pattern kullanmak için onu bir değerle karşılaştırırız ve bizim desenimizde bulunan bir değerle eşleşirse, kodumuzda değer kısımlarını kullanırız.
- match ile kullanımı
match VALUE {
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
}
Eşleştirme ifadeleri için bir gereklilik, eşleştirme ifadesindeki değer için tüm olasılıkların hesaba katılması gerektiği anlamında ayrıntılı olmaları gerektiğidir. Tüm olasılıkları ele aldığınızdan emin olmanın bir yolu, kalan tüm durumlar için kapsamlı bir örüntüye sahip olmaktır.
- if koşullu ifadeleriyle kullanılması
fn main() {
let favorite_color: Option<&str> = None;
let is_tuesday = false;
let age: Result<u8, _> = "34".parse();
if let Some(color) = favorite_color {
println!("Using your favorite color, {color}, as the background");
} else if is_tuesday {
println!("Tuesday is green day!");
} else if let Ok(age) = age {
if age > 30 {
println!("Using purple as the background color");
} else {
println!("Using orange as the background color");
}
} else {
println!("Using blue as the background color");
}
}
Yukarıdaki örnekte; eğer kullanıcı favori bir renk belirtirse, o renk arka plan olarak kullanılır. Favori renk belirtilmediği durumda işleme tabi tutulan gün Salı ise, arka plan rengi de yeşil olarak işleme girmektedir. Başka bir koşul ise kullanıcı yaşını string olarak belirtirse ve bunu sayı olarak başarılı bir şekilde ayrıştırabilirsek, sayının değerine göre renk ya mor ya da turuncu olur. Bu koşullardan hiçbiri geçerli değilse, arka plan rengi mavidir.
- for döngüsü örneği
let v = vec!['a', 'b', 'c'];
for (index, value) in v.iter().enumerate() {
println!("{} is at index {}", value, index);
}
- let örneği
let PATTERN = EXPRESSION;
- Aralık verilerek kullanılması( ..= )
let x = 5;
match x {
1..=5 => println!("one through five"),
_ => println!("something else"),
}
- Değişkene bağlanılması örneği
enum Message {
Hello { id: i32 },
}
let msg = Message::Hello { id: 5 };
match msg {
Message::Hello {
id: id_variable @ 3..=7,
} => println!("Found an id in range: {}", id_variable),
Message::Hello { id: 10..=12 } => {
println!("Found an id in another range")
}
Message::Hello { id } => println!("Found some other id: {}", id),
}