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_world
davranması gerektiğini belirtmesine izin verir .
Tek fark (anlamsal) olmasıdır trait
verilen bir tür için bu uygulama garanti T
uygulayan trait
, hello_world
hep 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?
trait
Yukarı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 trait
belirli 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
Self
için tek birReturn
ilişkili
- İkincisi ise, bunun yerine, uygulamaya olanak
MyTrait
için Self
birden 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, Deref
bariz bir kullanım durumu (teknik kısıt) olsa da, durum Add
daha az nettir: belki de içeriğe bağlı olarak i32 + i32
ya i32
da 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/MyStruct
tam olarak birimpl MyTrait for
veyaimpl MyStruct
. jenerik olduğu içintrait MyTrait<Return>
birden çokimpl
URL'ye izin verir .Return
herhangi bir tür olabilir. Genel yapılar aynıdır.