ch19-01-all-the-places-for-patterns
Desen Örneklerinin Kullanılabileceği Tüm Yerler
Desenler Rust'ta birçok yerde ortaya çıkar ve bunları çoğu zaman farkında olmadan kullanıyorsunuz! Bu bölüm, desenlerin geçerli olduğu tüm yerleri tartışır.
match
Kolları
Bölüm 6'da tartışıldığı gibi, match
ifadelerinin kollarında desenler kullanırız. Resmi olarak, match
ifadeleri match
anahtar kelimesi, eşleşilecek bir değer ve o değerin kolunun desenine uyması durumunda çalıştırılacak bir ifade içeren bir veya daha fazla eşleşme kolu ile tanımlanır, örneğin şöyle:
match DEĞER {
DESEN => İFADE,
DESEN => İFADE,
DESEN => İFADE,
}
Örneğin, aşağıda x
değişkenindeki bir Option
değerine uyan 6-5 numaralı listeden match
ifadesini görebilirsiniz:
match x {
None => None,
Some(i) => Some(i + 1),
}
Bu match
ifadesindeki desenler, her bir okun solundaki None
ve Some(i)
'dir.
:::note match
ifadeleri için bir gereklilik, kapsayıcı olmalarıdır; yani, match
ifadesindeki değer için tüm olasılıkların göz önünde bulundurulması gerekir. Her olasılığı kapsadığınızdan emin olmanın bir yolu, son kola genel bir desen koymaktır: örneğin, herhangi bir değeri eşleştiren bir değişken adı asla başarısız olamaz ve dolayısıyla kalan tüm durumları kapsar.
Belirli desen her şeyi eşleştirir, ancak hiçbir zaman bir değişkene bağlanmaz; bu nedenle genellikle son match
kolunda kullanılır. `` deseni, belirtilmemiş herhangi bir değeri göz ardı etmek istediğinizde faydalı olabilir. Bu bölümü ilerleyen sayfalarda “Desenlerde Değerleri Göz Ardı Etmek” bölümünde daha ayrıntılı olarak inceleyeceğiz.
Koşullu if let
İfadeleri
Bölüm 6'da, if let
ifadelerini esas olarak yalnızca bir durumu eşleştiren bir match
yazmanın daha kısa bir yolu olarak kullanmanın yolunu tartıştık. Opsiyonel olarak, if let
ifadelerinin, if let
'deki desen eşleşmediğinde çalıştırılacak kod içeren ilgili bir else
içermesi mümkündür.
Koşulların Birleştirilmesi
19-1 numaralı liste, if let
, else if
ve else if let
ifadelerini karıştırmanın mümkün olduğunu gösteriyor. Bunu yapmak, match
ifadesinden daha fazla esneklik sağlar, çünkü match
ifadesinde yalnızca desenlerle karşılaştırılacak bir değeri ifade edebiliriz. Ayrıca, Rust'ta bir dizi if let
, else if
, else if let
kollarındaki koşulların birbiriyle ilişkili olması gerekmez.
19-1 numaralı listedeki kod, birkaç koşul için yapılan kontroller serisine dayanarak arka plan renginin ne olacağını belirliyor. Bu örnekte, gerçek bir programın alabileceği sabit değerler içeren değişkenler oluşturduk.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-01/src/main.rs}}
Kullanıcı bir favori renk belirtirse, o renk arka plan olarak kullanılır. Favori renk belirtilmezse ve bugün Salı ise, arka plan rengi yeşil olur. Aksi takdirde, kullanıcı yaşını bir dize olarak belirtirse ve bunu başarıyla bir sayıya dönüştürebiliyorsak, renk sayının değerine bağlı olarak mor veya turuncu olur. Bu koşullardan hiçbiri sağlanmazsa, arka plan rengi mavi olur.
Bu koşullu yapı, karmaşık gereksinimleri desteklememizi sağlar. :::tip Burada kullandığımız sabit değerlerle bu örnek, Arka plan rengi olarak mor kullanılıyor
yazdırır.
Görüyorsunuz ki if let
aynı zamanda match
kollarında olduğu gibi gölgeli değişkenler de tanıtabilir: if let Ok(age) = age
satırı, Ok
varyantının içindeki değeri barındıran yeni bir gölgeli age
değişkeni tanıtır. Bu, if age > 30
koşulunu o blok içinde yerleştirmemiz gerektiği anlamına gelir: bu iki koşulu if let Ok(age) = age && age > 30
şeklinde birleştiremeyiz. Karşılaştırmak istediğimiz gölgeli age
, yeni kapsam eğrisi açıldığında geçerli olur.
:::warning if let
ifadelerinin dezavantajı, derleyicinin kapsayıcılığı kontrol etmemesi; oysa match
ifadelerinde kontrol edilir. Son else
bloğunu çıkarırsak ve dolayısıyla bazı durumları ele almazsak, derleyici bizi olası bir mantık hatası konusunda uyarmaz.
while let
Koşullu Döngüler
if let
ifadesine benzer şekilde, while let
koşullu döngüsü bir desen eşleşmeye devam ettikçe bir while
döngüsünün çalışmasına izin verir. while let
döngüsünü ilk olarak Bölüm 17'de, bir akış yeni değerler ürettiği sürece döngüde kalmak için kullandığımızda gördük. Benzer şekilde, 19-2 numaralı listede, bir Result
kontrol eden bir while let
döngüsü, ama bu durumda bir Option
yerine, gösteriyoruz.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-02/src/main.rs:here}}
Bu örnek 1, 2 ve 3 değerlerini yazdırır. :::info Bölüm 16'da recv
'i gördüğümüzde hatayı doğrudan çıkarttık veya onunla bir for
döngüsü kullanarak bir iteratör olarak etkileşime geçtik. Ancak 19-2 numaralı liste de gösteriyor ki, while let
de kullanabiliriz; çünkü recv
yöntemi gönderici mesajlar üretmeye devam ettikçe Ok
döndürüyor ve gönderici tarafı bağlantısını kesildiğinde Err
üretir.
for
Döngüleri
Bir for
döngüsünde, for
anahtar kelimesinden hemen sonra gelen değer bir desendir. Örneğin, for x in y
ifadesinde x
desenidir. 19-3 numaralı liste, bir for
döngüsünde bir deseni nasıl kullanarak bir demeti parçalamayı gösterir.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-03/src/main.rs:here}}
19-3 numaralı listedeki kod aşağıdakileri yazdıracaktır:
{{#include ../listings/ch19-patterns-and-matching/listing-19-03/output.txt}}
Bir iteratörü, onun bir değeri ve o değerin indeksini üretmesi için enumerate
yöntemi ile uyarlıyoruz; sonuçta bir demet elde ediyoruz. Üretilen ilk değer (0, 'a')
demetidir. Bu değer (index, value)
desenine eşleştirildiğinde, index
0 ve value
'a'
olur ve çıktının ilk satırını yazdırır.
let
İfadeleri
Bu bölümden önce, yalnızca desenleri match
ve if let
ile nasıl kullanacağımızı açıkça tartıştık, ancak aslında, let
ifadeleri de dahil olmak üzere başka yerlerde de desenleri kullandık. Örneğin, aşağıdaki basit değişken atamasına bir let
ifadesi ile bakalım:
let x = 5;
Bu tür bir let
ifadesi kullandığınız her seferde desenleri kullanıyorsunuz, ancak bunun farkında olmamış olabilirsiniz! Daha resmi bir şekilde, bir let
ifadesi şöyle görünür:
let DESEN = İFADE;
let x = 5;
gibi ifadelerde, PATTERN
alanında bir değişken adı olduğunda, bu değişken adı, aslında çok basit bir desen şeklidir. Rust, ifadeyi desenle karşılaştırır ve bulduğu isimleri atar. Yani let x = 5;
örneğinde, x
, burada "buraya uyanı değişken x
'e bağla" anlamına gelen bir desendir. x
ismi tüm desen olduğundan, bu desen aslında "değer ne olursa olsun her şeyi değişken x
'e bağla" anlamına gelir.
:::info let
ifadesinin desen eşleştirme yönünü daha net görmek için, 19-4 numaralı listeyi ele alalım; bu liste bir deseni kullanarak bir demeti parçalamak için let
ifadesini kullanıyor.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-04/src/main.rs:here}}
Burada, bir demeti bir desenle eşleştiriyoruz. Rust, (1, 2, 3)
değerini (x, y, z)
deseni ile karşılaştırır ve değer desene uyar, böylece Rust 1
değerini x
'e, 2
değerini y
'ye ve 3
değerini z
'ye bağlar. Bu demet desenini üç ayrı değişken deseni içeriyormuş gibi düşünebilirsiniz.
:::warning Desendeki eleman sayısı demetteki eleman sayısıyla eşleşmezse, genel tür eşleşmez ve derleme hatası alırız. Örneğin, 19-5 numaralı liste, üç elemanlı bir demeti iki değişkene parçalamaya çalışmanın örneğini gösterir; bu çalışmaz.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-05/src/main.rs:here}}
Bu kodu derleme girişiminde bulunmak, aşağıdaki tür hatasıyla sonuçlanır:
{{#include ../listings/ch19-patterns-and-matching/listing-19-05/output.txt}}
Hatayı düzeltmek için, demetteki bir veya daha fazla değeri _
veya ..
kullanarak göz ardı edebiliriz; bunu “Desenlerde Değerleri Göz Ardı Etme” bölümünde göreceksiniz. Problemin, desendeki çok sayıda değişken olmasından kaynaklandığı durumlarda, türleri eşleştirmenin çözümü, değişken sayısını demetteki eleman sayısıyla eşitlemek için bazı değişkenleri kaldırmaktır.
Fonksiyon Parametreleri
Fonksiyon parametreleri de desenler olabilir. 19-6 numaralı listede i32
türünde bir x
parametresi alan foo
adında bir fonksiyon beyanı, artık alışıldık görünmelidir.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-06/src/main.rs:here}}
x
bölümü bir desendir! let
ile yaptığımız gibi, bir fonksiyonun argümanlarında bir demeti desene eşleştirebiliriz. 19-7 numaralı liste, fonksiyona geçerken bir demetteki değerleri nasıl ayıracağını gösterir.
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-07/src/main.rs}}
Bu kod Mevcut konum: (3, 5)
yazdırır. Değerler &(3, 5)
deseni ile eşleşir, bu nedenle x
değeri 3
ve y
değeri 5
olur.
Desenleri, fonksiyon parametre listelerinde olduğu gibi, closure parametre listelerinde de aynı şekilde kullanabiliriz; çünkü closure'lar, Bölüm 13'te tartışıldığı gibi, fonksiyonlara benzer.
:::note Bu noktada, desenlerin nasıl kullanılacağına dair birkaç yolu gördünüz, ancak desenler her yerde aynı şekilde çalışmaz. Bazı yerlerde desenlerin kesinlikle karşı konulamaz olması gerekir; diğer durumlarda ise karşı konulabilir olabilirler. Bu iki kavramı sıradaki bölümlerde tartışacağız.