जबकि कार्य चर पर काम करते हैं, तो आप गुणों के प्रकार के रूप में लक्षणों के बारे में सोच सकते हैं। इस तरह से सोचा जाने पर, प्रकार पैरामीटर फ़ंक्शन में इनपुट के रूप में कार्य करते हैं और संबंधित प्रकार आउटपुट के रूप में कार्य करते हैं।
Output
के बाद से एक संबद्ध प्रकार, दो प्रकार के A
और B
कि हम impl Add
करना चाहते हैं के लिए है, हम एक ही Output
प्रकार उठा तक ही सीमित हैं। Output
एक प्रकार पैरामीटर थे, हम impl Add
A
और B
के असंख्य तरीके से कर सकते थे।
trait Mul<RHS, Output> {
fn mul(self, rhs: RHS) -> Output;
}
अब एक Complex
प्रकार को परिभाषित करते हैं:
#[derive(Debug, Clone, Copy)]
struct Complex {
x: f64,
y: f64,
}
impl Complex {
fn new(x: f64, y: f64) -> Complex {
Complex { x: x, y: y }
}
}
हम से गुणा करने के लिए सक्षम होना चाहते हैं
उदाहरण के लिए, हमें एक Mul
विशेषता जहां Output
एक पैरामीटर है निर्दिष्ट कर सकते हैं f64
:
impl Mul<f64, Complex> for Complex {
fn mul(self, rhs: f64) -> Complex {
Complex::new(self.x * rhs, self.y * rhs)
}
}
यह सब ठीक काम करता है। हालांकि, हम एक दूसरे कार्यान्वयन के साथ आ सकता है:
impl Mul<f64, f64> for Complex {
fn mul(self, rhs: f64) -> f64 {
self.x * rhs
}
}
जब हम अब एक f64
द्वारा एक Complex
गुणा, यह जो कार्यान्वयन बुलाया जाना चाहिए, और अतिरिक्त प्रकार की जानकारी फोन करने वाले द्वारा आपूर्ति किए जाने की जरूरत है अस्पष्ट है। Output
एक संबंधित प्रकार बनाकर, यह अस्वीकृत है।निम्नलिखित कोड परस्पर विरोधी कार्यान्वयन के लिए एक संकलक त्रुटि फेंकता है:
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
मैं देखता हूं। इसलिए, 'Mul' के साथ, आपको यह निर्धारित करने के लिए कि आप किसकी आवश्यकता है, आपको अपने चर प्रकार को 'x: Complex' या 'x: f64' के रूप में सेट करने की आवश्यकता है, इसलिए' टाइप आउटपुट 'निर्णय मुख्य रूप से' स्वच्छता 'निर्णय था । यह सबसे अच्छा जवाब जैसा दिखता है लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं इसे समझूं; क्या मैं पीछा करता हूँ? –
BHustus
इस तरह मैं इसे समझता हूं, हाँ। – paholg
और इसी प्रकार, मानक कार्यान्वयन को 'ओवरराइट' करने के किसी भी प्रयास को विफलता से मुलाकात की जाएगी, जिसका अर्थ यह है कि किसी भी प्रकार के किसी भी प्रकार के 'टीडी' के लिए एक परिभाषित 'std :: ops :: Mul 'परिभाषित किया गया है, पर इसका भरोसा किया जा सकता है * केवल * कार्यान्वयन हो। ठीक है, मुझे लगता है कि मुझे यह मिल गया। धन्यवाद! –
BHustus