मैंने दो तत्व Vector
संरचना बनाई और मैं +
ऑपरेटर को अधिभारित करना चाहता हूं।मैं संरचना के संदर्भ के लिए जोड़ें विशेषता कैसे कार्यान्वित करूं?
मैंने अपने सभी कार्यों और विधियों को मूल्यों के बजाय संदर्भ लेते हैं, और मैं +
ऑपरेटर को उसी तरह काम करने के लिए चाहता हूं।
impl Add for Vector {
fn add(&self, other: &Vector) -> Vector {
Vector {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
मैं किस बदलाव की कोशिश करता हूं, इस पर निर्भर करते हुए, मुझे या तो जीवन भर की समस्याएं मिलती हैं या विसंगतियों का प्रकार मिलता है। विशेष रूप से, &self
तर्क सही प्रकार के रूप में नहीं माना जाता है।
मैंने impl
पर टेम्पलेट तर्कों के साथ-साथ Add
पर उदाहरण देखे हैं, लेकिन वे केवल अलग-अलग त्रुटियों में परिणाम देते हैं।
मैं How can an operator be overloaded for different RHS types and return values? पाया, लेकिन जवाब में कोड काम नहीं करता है, भले ही मैं शीर्ष पर एक use std::ops::Mul;
डाल दिया।
मैं rustc 1.0.0-रात का उपयोग कर रहा (ed530d7a3 2015-01-16 22:41:16 +0000)
मैं "के रूप में क्यों एक संदर्भ का उपयोग आप केवल दो फ़ील्ड हैं," को स्वीकार नहीं करेगा एक जवाब; अगर मैं 100 तत्व संरचना चाहता था तो क्या होगा? मैं एक ऐसा उत्तर स्वीकार करूंगा जो दर्शाता है कि एक बड़ी संरचना के साथ भी मुझे मूल्य से गुजरना चाहिए, अगर ऐसा है (मुझे नहीं लगता कि यह है, हालांकि।) मुझे संरचना आकार के लिए अंगूठे का अच्छा नियम जानने में दिलचस्पी है और मूल्य बनाम संरचना से गुजर रहा है, लेकिन यह वर्तमान सवाल नहीं है।
"क्या होगा यदि मैं 100 तत्व संरचना चाहता हूं" - जंग आरवीओ जैसे अनुकूलन का उपयोग करता है जो उपयुक्त और बेहतर विकल्प के दौरान स्वचालित रूप से संदर्भ का उपयोग करेगा। – Shepmaster
@ शेमपस्टर: आरवीओ केवल वापसी मूल्य को प्रभावित करने जा रहा है, जिसे मैं मूल्य से वापस कर रहा हूं। क्या आप किसी भी दस्तावेज को इंगित कर सकते हैं जो दिखाता है कि बड़े structs के लिए गुण मूल्य द्वारा लागू किया जाना चाहिए? –
मुझे पता है कि सबसे अच्छा दस्तावेज [रिटर्निंग पॉइंटर्स पर पुस्तक अध्याय] होगा (http://doc.rust-lang.org/book/pointers.html#returning-pointers)। हालांकि, मैंने [एक बड़ी संरचना जोड़ने का एक उदाहरण बनाया] (http://is.gd/25ITa7) और जेनरेट किए गए एलएलवीएम (थोड़ा साफ) की जांच की: '(% struct.big * sret,% struct.big *,% struct.Big *) '। मैं एक एलएलवीएम विशेषज्ञ होने का दावा नहीं करता हूं, लेकिन ऐसा लगता है कि यह संदर्भ रूप से स्वचालित रूप से ले रहा है और लौट रहा है। – Shepmaster