2010-04-21 15 views
8

आरईपीएल पर कुछ सामान के साथ प्रयोग करते हैं, मैं एक बात करने के लिए मिल गया है, जहां मैं कुछ इस तरह की जरूरत: एक "==" ऑपरेटर के साथसरल स्कैला वाक्यविन्यास - "==" ऑपरेटर को परिभाषित करने की कोशिश कर रहा है - मुझे क्या याद आ रही है?

 
scala> class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } } 

बस एक साधारण क्लास।

यह क्यों काम नहीं करता ???

 
:10: error: type mismatch; 
found : A 
required: ?{val x: ?} 
Note that implicit conversions are not applicable because they are ambiguous: 
both method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A] 
and method any2Ensuring in object Predef of type [A](x: A)Ensuring[A] 
are possible conversion functions from A to ?{val x: ?} 
     class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } } 
                     ^

यह स्केला 2.8 RC1 है:

यहाँ परिणाम है।

धन्यवाद

उत्तर

14

आप equals(other:Any):Boolean समारोह को परिभाषित करने के लिए है, तो स्काला आप मुक्त करने के लिए ==,

के रूप में परिभाषित देता
class Any{ 
    final def == (that:Any):Boolean = 
    if (null eq this) {null eq that} else {this equals that} 
} 

देखें के बारे में अधिक के लिए स्काला में प्रोग्रामिंग के अध्याय 28 (वस्तु समानता) कैसे करने के लिए equals फ़ंक्शन लिखें ताकि यह वास्तव में एक समकक्ष संबंध हो।

इसके अलावा, पैरामीटर x जो आप अपनी कक्षा में पास करते हैं उसे फ़ील्ड के रूप में संग्रहीत नहीं किया जाता है। आपको इसे class A(val x:Int) पर बदलना होगा ..., और फिर उसके पास एक एक्सेसर होगा जिसका उपयोग आप equals ऑपरेटर में a.x तक पहुंचने के लिए कर सकते हैं।

+2

मुझे लगता है कि यह कहने के लिए और अधिक सटीक है कि यह एक क्षेत्र के रूप में * सुलभ * नहीं है यानी यह एक्सेसर विधियों को उत्पन्न नहीं करता है जब तक कि आप इसे 'वैल' के रूप में घोषित नहीं करते हैं। –

+0

एमएम हम्म। एलेक्स अन्य कारणों से 'वैल' जोड़ना चाह सकता है, लेकिन कोई व्यक्ति आपके उत्तर को यह बता सकता है कि 'बराबर' के शरीर में 'x' तक पहुंचने के लिए इसकी आवश्यकता है। –

+0

मैंने यह स्पष्ट करने के लिए अपना उत्तर संपादित कर दिया है कि आपको 'बराबर' के शरीर में 'a.x' तक पहुंचने के लिए 'val' की आवश्यकता है। –

7

त्रुटि संदेश पेड्रिफ़ में कुछ कोड के साथ संयोग के कारण थोड़ा उलझन में है। लेकिन वास्तव में यहां क्या चल रहा है यह है कि आप विधि को अपने A कक्षा पर कॉल करने का प्रयास कर रहे हैं, लेकिन उस नाम के साथ कोई विधि परिभाषित नहीं है।

प्रयास करें:

class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } } 
बजाय

। यह वाक्यविन्यास xA का सदस्य बनाता है, जो सामान्य एक्सेसर विधि के साथ पूरा होता है।

जैसा कि केन ब्लूम ने उल्लेख किया है, हालांकि, == के बजाय equals को ओवरराइड करना एक अच्छा विचार है।

संबंधित मुद्दे