Guard
- Rust kursu
- İleri seviye
- Ders 75/81
- 4 dk
if guard ile kalıp koşulu eklemeyi öğrenirsin.
Guard
Kalıbın ifade edemediği koşullar (iki bağlanan değişken arasındaki ilişki gibi) kolun sonuna if ile eklenir:
fn iliski(c: (i32, i32)) -> &'static str {
match c {
(a, b) if a == b => "eşit",
(a, b) if a + b == 0 => "zıt",
_ => "farklı",
}
}Guard'lar dış değişkenlere de erişebilir: Some(x) if x == hedef. Kalıp içinde dış bir değişken adı yazmak ise eşleşme değil yeni bir bağlama demektir; bu sık bir hatadır.
Guard ve kapsayıcılık
Derleyici guard koşullarını değerlendirmez; bu yüzden guard'lı kollar kapsayıcılık denetiminde sayılmaz ve sonda genellikle koşulsuz bir kol gerekir:
match n {
x if x < 0 => "negatif",
x if x >= 0 => "pozitif ya da sıfır",
_ => unreachable!(), // derleyici iki koşulun her şeyi kapsadığını bilmez
}Böyle durumlarda kalıpları aralıkla yazmak daha iyidir: i32::MIN..=-1 ve 0...
Uygulama İlişki
Yukarıdaki iliski fonksiyonunu guard'larla yaz. (2, 2), (3, -3) ve (1, 5) için sonuçları boşlukla tek satırda yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn iliski(c: (i32, i32)) -> &'static str {
match c {
(a, b) if a == b => "eşit",
(a, b) if a + b == 0 => "zıt",
_ => "farklı",
}
}
fn main() {
println!("{} {} {}", iliski((2, 2)), iliski((3, -3)), iliski((1, 5)));
}Beklenen çıktı
eşit zıt farklı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>let hedef = 5; match v { Some(hedef) => .., _ => .. }</code> ne yapar?
- Her Some değerini eşler ve yeni bir hedef değişkeni oluşturur (gölgeleme) Doğru cevap
- Yalnızca Some(5) ile eşleşir
- Derlenmez
- Panic
Açıklama: Kalıptaki ad her zaman yeni bir bağlamadır; karşılaştırma için Some(x) if x == hedef yazılmalı.
2 Koşullu kol
match c {
(a, b) ____ a == b => "eşit",
_ => "farklı",
}
match c {
(a, b) if a == b => "eşit",
_ => "farklı",
}
Açıklama: Guard kalıptan sonra if ile yazılır.
3 İkili ve sonuç
| Kavram | Anlamı |
|---|---|
(2, 2) |
eşit |
(3, -3) |
zıt |
(1, 5) |
farklı |
(0, 0) |
eşit (ilk kol) |