Trait bounds (trait sınırlamaları), belirli bir trait için uygulanması gereken özelliklerle genel türleri sınırlamak için Rust'ta kullanılır. Bu, generic işlevler veya türler içinde trait'in yöntemlerini ve özelliklerini kullanmayı mümkün kılar.
Temel yaklaşımlar:
Fonksiyon parametrelerinde T: SomeTrait sözdizimi kullanımı:
fn print_debug<T: std::fmt::Debug>(item: T) { println!("{:?}", item); }
Okunabilirliği artırmak için where anahtar kelimesinin kullanımı:
fn print_multiple<T, U>(a: T, b: U) where T: std::fmt::Debug, U: std::fmt::Display, { println!("a = {:?}, b = {}", a, b); }
where sözdizimi özellikle birden fazla ve uzun sınırlamalarda faydalıdır. Trait bounds, derleyicinin belirli yöntemlerin/özelliklerin belirli bir generic parametrede mevcut olduğunu garanti etmesi için gereklidir.
Soru: Trait bound olmadan bir genel türde trait yöntemini çağırmaya çalıştığınızda, o türün gerekli trait'i uyguladığı bilinse bile ne olur?
Cevap: Rust, bir genel türde trait yöntemlerini açıkça trait bound belirtmeden kullanmanıza izin vermez, hatta o türün bunu uyguladığı bilinse bile. Hata örneği:
fn show(x: T) { println!("{}", x.to_string()); // Hata: derleyici T'nin ToString'i uygulayıp uygulamadığını bilmiyor }
Derleyici, methodun mevcut olduğunu garanti edemediği için hata verir. Tek doğru yol T: ToString eklemektir.
Hikaye
Büyük bir JSON serileştirme kütüphanesinde, geliştirici gerekli trait bound olan T: Serialize'ı genel serileştirme fonksiyonuna eklememiştir. Sonuç olarak, genel fonksiyon serileştirme yöntemlerini kullanmayı engellemiş; müşterileri yanıltan yanlış bir derleme hatası almışlardır.
Hikaye
Bir ağ kütüphanesinde basit türlerden genel türlere geçiş sırasında, yapı parametreleyen türe trait bound atlanmıştır. Bu, yapı yöntemlerinin genel işlevlerde kullanılmasını mümkün kılmamıştır ve gereksiz kod tekrarlarına yol açmıştır.
Hikaye
Açık kaynak bir projede, iç modüllerde trait bounds'u gizleyerek ilanları kısaltmaya karar verdiler. Ardından, API kullanıcıları gerekli olan trait'lerin ne olduğunu bilemeyerek, kütüphaneyi kullanırken karmaşık derleyici mesajları almışlardır.