İşlevler değişkenler üzerinde çalışırken, özellikleri türlerde çalışan işlevler olarak düşünebilirsiniz. Bu şekilde düşünüldüğünde, tip parametreleri işleve girdi olarak işlev görür ve ilişkili türler çıktı olarak işlev görür. Output
yana
biz impl Add
isteyen iki tip A
ve B
için ilişkili bir türüdür, biz tek Output
tip toplama ile sınırlıdır. Output
bir tip parametresiydi,ve B
için impl Add
ve çeşitli şekillerde olabilir.
trait Mul<RHS, Output> {
fn mul(self, rhs: RHS) -> Output;
}
Şimdi
bize Complex
türü tanımlayalım:
#[derive(Debug, Clone, Copy)]
struct Complex {
x: f64,
y: f64,
}
impl Complex {
fn new(x: f64, y: f64) -> Complex {
Complex { x: x, y: y }
}
}
Biz çarpın edebilmek istiyorum Örneğin
bize Output
bir parametredir bir Mul
özelliği tanımlayalım f64
:
impl Mul<f64, Complex> for Complex {
fn mul(self, rhs: f64) -> Complex {
Complex::new(self.x * rhs, self.y * rhs)
}
}
Bu her şey yolunda. Ancak, ikinci bir uygulaması ile gelebilir:
impl Mul<f64, f64> for Complex {
fn mul(self, rhs: f64) -> f64 {
self.x * rhs
}
}
artık bir f64
tarafından Complex
çarpın, çağrılmalıdır ve ekstra türü bilgileri arayan tarafından temin edilecek gerekli olan uygulama belirsiz. İlgili bir tür Output
yaparak, bu izin verilmez.Aşağıdaki kod çelişkili uygulamaları için bir derleyici hatası atar:
impl std::ops::Mul<f64> for Complex {
type Output = Complex;
fn mul(self, rhs: f64) -> Complex {
Complex::new(self.x * rhs, self.y * rhs)
}
}
impl std::ops::Mul<f64> for Complex {
type Output = f64;
fn mul(self, rhs: f64) -> Complex {
self.x * rhs
}
}
Full example
Anladım. Yani, "Mul" ile, hangisini istediğinize karar vermek için değişken türünüzü "x: Karmaşık" veya "x: f64" olarak ayarlamanız gerekir, bu nedenle "Tür Çıktısı" kararı öncelikli olarak "düzenli" bir karardı. . Bu en iyi cevaba benziyor ama anladığımdan emin olmak istiyorum; ben takip ederim –
BHustus
Anladığım kadarıyla, evet. – paholg
Ve benzer şekilde, standart uygulamanın 'üzerine yazılmasına' yönelik herhangi bir girişim başarısızlıkla karşılanır; bu, herhangi bir "T" için tanımlanmış bir 'std :: ops :: Mul' türüne sahip olduğunda, buna güvenilebilir * sadece * uygulama. Tamam, sanırım anladım. Teşekkürler! –
BHustus