Ekleme C: Türetilebilir Tanımlar
Kıtabın farklı bölümlerinde yapıya ya da numaralandırılmış yapıya dahil edebileceğiniz derive tanımını anlatmıştık.
derive tanımı, yazdığınız derive süreklemesini sürekleyerek kod üretir.
Bu ekte, derive ile kullanabileceğiniz standart kütüphanedeki tüm
tanımların bir referansını sunuyoruz. Her bölüm şunları kapsar:
- Bu tanımı türeten hangi operatörler ve yöntemler etkinleştirilecek
derivetarafından sağlanan tanımın süreklenmesi ne iş yapar- Tanımın süreklenmesi, tür için ne anlama gelir
- Tanımı süreklemenize izin verilen ve verilmeyen koşullar
- Tanımı gerektirecek operasyonların örnekleri
derive tarafından sağlanandan farklı bir davranış istiyorsanız,
bunların manuel olarak nasıl sürekleneceğine ilişkin ayrıntılar için standart kütüphanenin dokümantasyonuna bakın.
Standart kütüphanede tanımlanan özelliklerin geri kalanı derive kullanılarak türlerinize uygulanamaz.
Bu özelliklerin mantıklı varsayılan davranışları yoktur, bu nedenle bunları başarmaya çalıştığınız şey için anlamlı olacak şekilde süreklemek size kalmıştır. Son kullanıcılar için biçimlendirmeyi yöneten Display, türetilemeyen bir tanıma örnektir. Her zaman bir türü son kullanıcıya göstermenin uygun yolunu düşünmelisiniz. Bir son kullanıcının türün hangi kısımlarını görmesine izin verilmelidir? Hangi kısımları alakalı bulacaklar? Hangi veri formatı onlar için en uygun olur? Rust derleyicisi bu içgörüye sahip değildir, bu nedenle sizin için uygun varsayılan davranışı sağlayamaz. Bu ekte sağlanan türetilebilir tanımların listesi kapsamlı değildir: kütüphaneler, türetmeyi kendi tanımları için sürekleyebilir ve kullanabileceğiniz özelliklerin listesini gerçekten açık uçlu olarak türetebilir. derive'ın süreklemesi, Bölüm 19'un “Makrolar” bölümünde ele alınan prosedürel bir makro kullanmayı içerir.
Programcı Çıktısı için Debug Tanımı
Debug tanımı {}'ın içine :? koyarak kullanabileceğiniz hata ayıklama formatlaması için dizgi düzenlemesini aktifleştirir.
Debug tanımı nesnelerin türlerini hata ayıklamanız için yazdırmaya izin verir.
assert_eq! makrosunun kullanımında Debug tanımını kullanmak gereklidir. Bu makro eğer her iki nesne de birbirine
eşit değilse bir hata göndererek yazılımcıların nerede hata olduğunu görmelerine yardımcı olur.
Eşitlik Kıyaslamaları için PartialEq ve Eq Tanımları
PartialEq tanımı == ve != operatörlerini herhangi bir nesne türünde kullanmanız için gerekli olan tanımdır.
PartialEq'ı tanımlamak eq metodunu otomatik olarak sürekler. Her ne zaman PartialEq yapılarda
tanımlanırsa, her iki nesnenin her alt üyesi eşitse nesnelerin eşitliğine karar verir. Numaralandırılmış
yapılar için her varyant kendi içinde eşittir ve diğer varyantlarla eşitlik söz konusu değildir.
Her iki nesnenin eşitliğinin kontrolü için assert_eq! makrosunda PartialEq'i tanımlamak gereklidir.
Eq tanımı herhangi bir metoda sahip değildir. Asıl amacı verilen türün her değeri için eşitliğinin kontrolüdür.
Eq tanımı sadece PartialEq'i de tanımlayan tanımlar için geçerlidir. Ayrıca PartialEq'i sürekleyebilen her tür
Eq'i de sürekleyebileceği anlamına gelmez. Bir örnek olarak, kayan nokta sayı türleri örnek verilebilir. Bu türün süreklemesi
her iki nesnenin de birbirine eşit olmadığı durumlarda sayı-değili (NaN) döndürür.
Örneğin her ne zaman Eq, HashMap<K, V> için gerekirse bize her iki nesnenin de eşit olup olmadığını söyleyebilecek bir
tanımı belirtmiş olur.
Sıralama Kıyaslamaları için PartialOrd ve Ord Tanımları
PartialOrd tanımı, sıralama amaçları için türleri kıyaslamaya izin verir. PartialOrd'ı sürekleyen bir tür,
<, >, <=, ve >= operatörlerini de aynı tür için kullanabilir hale gelir. PartialOrd tanımını ancak PartialEq'i de
tanımlayan tanımlar için kullanabilirsiniz.
PartialOrd'ı tanımlamak ayrıca eğer verilen değerler herhangi bir sıralamaya tabii tutulamadığı durumlarda
None, diğer durumlarda Option<Ordering> döndüren partial_cmp metodunu da sürekler.
Bir örnek olaraktan, partial_cmp'ı herhangi bir kayan noktasal sayı ile kullanmak None döndürecektir.
Her ne zaman yapılar için tanımlanmışsa, PartialOrd her iki nesnenin her üye içindeki her değerini kıyaslar.
Numaralandırılmış yapılar için tanımlandığında, tüm varyantları önceden tanımlanandan sonradan tanımlanana şeklinde sıralar.
PartialOrd tanımı bu durumlar için gereklidir; örneğin rand kasasındaki gen_range metodu, verilen aralıkta
ve ifadede sözde rastgele bir değer üretir.
Ord tanımı ayrıca verilen iki değer arasında doğru bir sıralamanın olup olmadığını da
size belirtir. Ord tanımı, Option<Ordering> yerine Ordering tanımını döndüren cmp metodunu sürekler. Ordering
tanımını döndürmesinin asıl sebebi, doğru bir sıralamanın her zaman olabileceği ihtimalindendir.
Ord tanımını türlere ancak PartialOrd ve Eq'i (ayrıca Eq de PartialEq'i tanımlamayı zorunlu kılar) de sürekleyen tanımlar için uygulayabilirsiniz. Yapılar ve numaralandırılmış yapılar üzerinde uygulandığında cmp partial_cmp'in PartialOrd'u süreklerken
yaptığı gibi aynı yolu uygular.
BTreeSet<T>'de veriler tutmanız gerektiğinde Ord tanımını kullanmanız gerekir çünkü bu veri yapısı
verileri sıralanmış olarak tutar.
Değerleri Çoğaltmak için Clone ve Copy Tanımları
Clone tanımı değerin derin bir kopyasını oluşturmanıza izin verir ve bu çoğaltma işlemi rastgele kod
çalıştırmayı ve yığın verisi kopyalamasına sebep olabilir.
Clone hakkında daha fazla bilgi için “Değişkenler ve Veri Etkileşiminin Yolları: Clone”
bölümüne göz atabilirsiniz.
Clone'i tanımlamak ayrıca tüm türler için kullanılabilecek clone metodunu da sürekler.
Örneğin bir dilim üzerinde to_vec metodunu çalıştırmak için Clone'un tanımlanması gerekir.
Copy tanımı yığında tutulan bitleri çoğaltmanıza izin verir.
Copy hakkında daha fazla bilgi için “Yığın Öncelikli Veri Tanımı: Copy”
bölümüne göz atabilirsiniz.
Copy tanımı herhangi bir rastgele kod çağırma konusunda yapıyı istismar etmeyi önlemek için herhangi bir metod tanımlamaz.
Bu yönüyle yazılımcılar bu şekilde veriyi kopyalamanın aşırı hızlı olduğunu düşüneceklerdir.
Copy'i tüm yapı üyeleri Copy'i tanımlayan yapılar için de kullanabilirsiniz.
Copy'i tanımlayan bir nesne ayrıca Clone'u da tanımlamak zorundadır çünkü,
Copy'i tanımlayan bir tür önemsiz bir Clone tanımlamasına da sahiptir, yani Copy ile benzer görevi yapar.
Copy tanımı çoğu zaman gerekmez; Copy'i tanımlayan türler ayrıca optimizasyonlara da sahiptir yani
clone kullanmamanız kodunuzu daha yalın ve öz yapacaktır.
Copy ile mümkün olan her şey Clone ile de mümkündür fakat clone metodunun kullanılması bazı yerlerde
kodunuzu yavaşlatabilmektedir.
Değerleri Birleştirmek için Hash Tanımı
Hash tanımı sabit değerli bir türün örneğini almanıza izin verir.
Hash'i tanımlamak ayrıca hash metodunu da sürekler.
Varsayılan Değerler için Default Tanımı
Default tanımı bir türe varsayılan bir değer atamanıza izin verir. Default'u tanımlamak
default fonksiyonunu da sürekler.
Default::default fonksiyonu çoğunlukla “Yapı Güncelleme Söz Dizimi ile Diğer Örneklerden Örnekler Oluşturma”
bölümünde de belirtildiği şekliyle yapı güncelleme söz dizimiyle birlikte kullanılır. Yapının üyelerini
düzenleyebilir ve daha sonra geri kalan üyeler için varsayılan tür değerlerini ..Default::default() ile atayabilirsiniz.
Option<T> örnekleri üzerinde unwrap_or_default metodunu kullanabilmeniz için Default tanımınının da tanımlanmış olması
gerekir. Örneğin, Option<T> None ise , unwrap_or_default metodu Option<T>'de depolanan T türü için Default::default'un
sonucunu döndürecektir.