2010-08-25 19 views
6

क्या कोई मुझे बता सकता है कि क्यों अंतर्निहित प्रकार रूपांतरण == के साथ काम नहीं करता है?स्कैला निहित प्रकार रूपांतरण और ==

उदाहरण:

class BitArray(l: Int, v: Long) { 
    val length = l 
    var value = v 
    def ==(that: BitArray) = value == that.value 
    def ==(integer: Long) = value == integer 
    def +(that: BitArray) = new BitArray(length,value+that.value) 
    def +(integer: Long) = new BitArray(length,value+integer) 
//... 
} 
object BitArray{ 
     implicit def longToBitArray(x : Long) = new BitArray(64,x) 
     def apply(v: Long) :BitArray = apply(64,v) 
} 

अब मैं कर सकते हैं:

scala> BitArray(5) + 5 
res13: BitArray = 00000000000000000000000000001010 
scala> 5 + BitArray(5) 
res14: BitArray = 00000000000000000000000000001010 
scala> BitArray(5) == 5 
res15: Boolean = true 
scala> BitArray(5) == 6 
res16: Boolean = false 

लेकिन:

scala> 5 == BitArray(5) 
<console>:11: warning: comparing values of types Int and BitArray using `==' will 
always yield false 
     5 == BitArray(5) 
     ^ 
res17: Boolean = false 

उत्तर

12

आप स्कैला का एक मौलिक पहलू खो रहे हैं, यह समानता कैसे काम करता है।

मूल रूप से, सभी वर्गों AnyRef विस्तार निम्न विधि को लागू:

def equals (arg0: Any) : Boolean 

और सभी वर्गों के लिए निम्न विधि को लागू:

def == (arg0: Any) : Boolean 

अब, आप नहीं ==, लेकिन equals ओवरराइड करना चाहिए। विधि ==equals पर कॉल करेगी, लेकिन जावा कोड equals का उपयोग करेगा, == नहीं। यह आपके द्वारा देखी जाने वाली समस्या का कारण नहीं है, लेकिन यह महत्वपूर्ण है कि मुझे लगता है कि यह उल्लेखनीय है।

अब, निहित काम करने के लिए, याद रखें कि निहितार्थ केवल तभी देखा जाता है जब आपके कोड को संतुष्ट करने वाली कोई विधि न हो। हालांकि, Int की == की तुलना BitArray के साथ की जा सकती है, क्योंकि ==Any के प्रकार का तर्क प्राप्त करता है। इसलिए, Int की समानता विधि कहा जाता है, और कोई अंतर्निहित नहीं देखा जाता है।

+0

बहुत स्पष्ट उत्तर के लिए धन्यवाद :-) –

+1

स्कैला का इतना मौलिक पहलू नहीं है, लेकिन मानक पुस्तकालय मूल रूप से टूटा हुआ है इसका एक पहलू। – Apocalisp

+2

@Apocalisp मेरा मूलभूत अर्थ था "यदि आप स्कैला का उपयोग करना चाहते हैं तो आपको यह जानना चाहिए"। –

6

== ऑपरेटर ओवरराइड करने के लिए, आप वास्तव में equals विधि ओवरराइड करना चाहिए:

override def equals(other: Any): Boolean = other match { 
    case ba: BitArray => value == ba.value 
    case _ => false 
} 

आप BitArray का उदाहरण Long के बराबर नहीं बना सकते हैं और फिर भी बराबर अनुबंध (यानी। यह सममित नहीं होगा)।

+0

क्या आप विस्तृत कर सकते हैं? या मुझे कुछ दस्तावेज की दिशा बताएं कि बराबर कैसे काम करता है? धन्यवाद –

0

अन्य उत्तरों को जोड़ना, याद रखें कि बराबर कार्य सिमेट्रिक होना चाहिए, जो (a equals b) == (b equals a) है।

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