2012-03-24 13 views
7

मैं स्कैला में प्रोग्रामिंग के माध्यम से पढ़ रहा हूं। इसे कहते हैं:स्कैला: क्या == डिफ़ॉल्ट बराबर है?

आप equals विधि है, जो हमेशा वर्ग Any से विरासत में मिली है अधिभावी द्वारा नए प्रकार के लिए == के व्यवहार को फिर से परिभाषित कर सकते हैं। विरासत में equals, जो ओवरराइड होने तक प्रभावी होता है, ऑब्जेक्ट पहचान है, जैसा कि जावा में है। तो equals (और इसके साथ, ==) डिफ़ॉल्ट रूप से eq जैसा ही है, लेकिन आप परिभाषित कक्षाओं में equals विधि को ओवरराइड करके अपना व्यवहार बदल सकते हैं। == को सीधे ओवरराइड करना संभव नहीं है, क्योंकि इसे कक्षा Any में अंतिम विधि के रूप में परिभाषित किया गया है। यही है, स्काला == व्यवहार करता है के रूप में अगर वर्ग Any में इस प्रकार के रूप में परिभाषित किया गया था:

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

लेकिन यह मैं क्या स्केला 2.9.1, यह की तरह लगता है जहां में दिखाई दे रही है साथ jibing नहीं है:

  • == डिफ़ॉल्ट equals
  • को मैं == सीधे (बिना किसी शिकायत के संकलक से, कोई override आवश्यक) ओवरराइड कर सकते हैं नहीं लगता है।

तो यह की तरह या तो मुझे लगता है: मैं इसे गलत कर रहा हूँ

  • - this definition of Rational

    % scala                 
    Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 
    Type in expressions to have them evaluated. 
    Type :help for more information. 
    
    scala> Rational(1) == Rational(1) 
    res0: Boolean = false 
    
    scala> Rational(1) equals Rational(1) 
    res1: Boolean = true 
    
  • देता है या मैं के पुराने संस्करण का बाहर पढ़ रहा हूँ किताब, और चीजें बदल गई हैं।

क्या चल रहा है?

उत्तर

21

आप एक बहुत ही समझदार गलती कर रहे हैं - आप जेनेरिक बराबर (यानी override def equals(a: Any)) के बजाय एक प्रकार-सुरक्षित बराबर (यानी def equals(r: Rational)) लिखने की कोशिश कर रहे हैं।

तो अधिभावी equals --note के बजाय कि आप override कीवर्ड की जरूरत नहीं है - आप प्रकार पैरामीटर अधिक भार से किसी अन्य विधि का निर्माण कर रहे हैं, और फिर, जिनमें लेता Rational और एक होने दो तरीकों के बराबर होती है जो Any लेता है। == के साथ वही बात; केवल Any -parameterized विधि ओवरराइड नहीं किया जा सकता है।

तरह

override def equals(a: Any) = a match { 
    case r: Rational => numer == r.numer && denom == r.demon 
    case _ => false 
} 
+0

बहुत बढ़िया कुछ के रूप में व्यवहार जावा (और स्काला पुस्तकालय) के साथ संगत है, तो आप को फिर से लिखने की जरूरत होगी के बराबर होती है पाने के लिए। यह हर बार जब मैं जेवीएम भूमि पर लौटता हूं तो मुझे काटता है। मैं इसे जल्दी या बाद में सीखूंगा। क्या वैसे भी मैं 'एक मैच' छोड़ सकता हूं और बस एक अनाम कार्य को 'बराबर' असाइन कर सकता हूं? 'डीफ़ बराबर ओवरराइड करें: कोई भी => बूलियन = {केस आर: तर्कसंगत/* ... * /} 'काफी काम नहीं करता है ... – rampion

+2

@ रैंपियन - नहीं, आपको बिल्कुल प्रकार के हस्ताक्षर से मिलान करना होगा। 'बराबर: कोई भी => बूलियन 'का अर्थ है कि यह एक फ़ंक्शन देता है (यानी' फंक्शन 1 [कोई भी, बूलियन] 'वर्ग का एक उदाहरण)। भले ही यह कुछ अर्थों में अवधारणात्मक रूप से समतुल्य है, यह एक ही विधि नहीं है, इसलिए यह काम नहीं करेगा। –

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