Buna artık The Rust Programming Language'in ikinci baskısında değiniliyor . Ancak ek olarak biraz da dalalım.
Daha basit bir örnekle başlayalım.
Bir özellik yöntemini kullanmak ne zaman uygundur?
Geç bağlama sağlamanın birden çok yolu vardır :
trait MyTrait {
fn hello_word(&self) -> String;
}
Veya:
struct MyTrait<T> {
t: T,
hello_world: fn(&T) -> String,
}
impl<T> MyTrait<T> {
fn new(t: T, hello_world: fn(&T) -> String) -> MyTrait<T>;
fn hello_world(&self) -> String {
(self.hello_world)(self.t)
}
}
Herhangi bir uygulama / performans stratejisini göz ardı ederek, yukarıdaki her iki alıntı da kullanıcının dinamik bir şekilde nasıl hello_worlddavranması gerektiğini belirtmesine izin verir .
Tek fark (anlamsal) olmasıdır traitverilen bir tür için bu uygulama garanti Tuygulayan trait, hello_worldhep oysa aynı davranışı sahip olacakstruct uygulaması örneği bazında farklı bir davranış sahip tanır.
Bir yöntemi kullanmanın uygun olup olmadığı, kullanım durumuna bağlıdır!
İlişkili bir türü kullanmak ne zaman uygundur?
traitYukarıdaki yöntemlere benzer şekilde , ilişkili bir tür (derlemede meydana gelse de) geç bağlanmanın bir biçimidir ve kullanıcının traitbelirli bir örnek için hangi türün ikame edeceğini belirtmesine izin verir . Tek yol bu değil (dolayısıyla soru):
trait MyTrait {
type Return;
fn hello_world(&self) -> Self::Return;
}
Veya:
trait MyTrait<Return> {
fn hello_world(&Self) -> Return;
}
Yukarıdaki yöntemlerin geç bağlanmasına eşdeğerdir:
- birincisi, bir verilen
Selfiçin tek birReturn ilişkili
- İkincisi ise, bunun yerine, uygulamaya olanak
MyTraitiçin Selfbirden içinReturn
Hangi formun daha uygun olduğu, birliği uygulamanın mantıklı olup olmadığına bağlıdır. Örneğin:
Deref ilişkili bir tür kullanır çünkü teklik olmazsa derleyici çıkarım sırasında çıldırır
Add ilişkili bir türü kullanır çünkü yazarı, iki bağımsız değişken verildiğinde mantıksal bir dönüş türü olacağını düşünür.
Görebileceğiniz gibi, Derefbariz bir kullanım durumu (teknik kısıt) olsa da, durum Adddaha az nettir: belki de içeriğe bağlı olarak i32 + i32ya i32da bunlardan birini vermek mantıklı Complex<i32>olabilir mi? Bununla birlikte, yazar kendi kararlarını kullandı ve eklemeler için iade türünün aşırı yüklenmesinin gereksiz olduğuna karar verdi.
Benim kişisel duruşum, doğru cevap olmadığı yönünde. Yine de, teklik argümanının ötesinde, ilişkili türlerin, belirtilmesi gereken parametrelerin sayısını azalttıkları için özelliği kullanmayı kolaylaştırdığından bahsedeceğim, bu nedenle, düzenli bir özellik parametresi kullanmanın esnekliğinin faydalarının açık olmaması durumunda, I ilişkili bir türle başlamayı önerin.
trait/struct MyTrait/MyStructtam olarak birimpl MyTrait forveyaimpl MyStruct. jenerik olduğu içintrait MyTrait<Return>birden çokimplURL'ye izin verir .Returnherhangi bir tür olabilir. Genel yapılar aynıdır.