2011-08-14 20 views
7

मैं स्केला 2.7.7 के अंतर्निहित वर्ग MessageQueue.scala में देखते हैं, लाइन 164 के आसपास है, यह है:स्कैला में `null == last` और` null eq last` के बीच क्या अंतर है?

def extractFirst(p: Any => Boolean): MessageQueueElement = { 
changeSize(-1) // assume size decreases by 1 

val msg = if (null eq last) null 
else { 
    ... 
    } 
} 

मैं val msg = if (null eq last) null अच्छी तरह से समझ में नहीं आता, यह क्यों eq, लेकिन नहीं null उपयोग करता है। अगर मैं if (last==null) null लिखता हूं, तो क्या यह सही है? क्या कोई अंतर है?

+0

लेकिन 'शून्य' के साथ तुलना करने के लिए, क्या कोई अंतर है? क्या मैं यहां 'null == last' का उपयोग कर सकता हूं? – Freewind

उत्तर

13

जब ==के दोनों ओरnullया है अगर ==के पहले संकार्य अशक्त करने के लिए मूल्यांकन करता है, तो स्काला equals आह्वान नहीं होंगे। तो, इस मामले में, हाँ, x == nullx eq null जैसा ही है; equals विधि लागू नहीं है। नीचे दिए गए मामलों पर ध्यान दें।

इस पर विचार करें:

class X { 
    // this is just for testing 
    // any equals that returns true when the other object is null 
    // is arguably broken. thus even though it may be invoked 
    // the end semantics should remain the same 
    override def equals(x: Any) = true 
} 
var x = new X() 
x == null // false -- compiler optimization? 
null == x // false 
var y = null 
y == x // false -- see documentation below, y is null, x is not 
x == y // true -- x does not evaluate to null, equals invokes 
x eq y // false 

और ध्यान दें कि:

एक चेतावनी में
(new X()) == null 

परिणाम कह एक "एक ताजा वस्तु" (शून्य करने के लिए) बराबर कभी नहीं होगा।

मुझे संदेह है कि x == yx == null (बराबर बराबर लागू किया जाना चाहिए) से थोड़ा अधिक/अलग कोड उत्सर्जित हो सकता है, लेकिन जांच नहीं की है।

हैप्पी कोडिंग।


धारा 6.3 (शून्य मान) स्काला भाषा विशिष्टता के इस कहना है:

शून्य मान प्रकार scala.Null की है, और इस तरह हर संदर्भ के साथ संगत है प्रकार। यह संदर्भ मान को दर्शाता है जो एक विशेष "शून्य" ऑब्जेक्ट को संदर्भित करता है। इस प्रकार इस वस्तु वर्ग scala.AnyRef में तरीकों को लागू करता है:

  • [अमान्य] eq (x) और [अमान्य] == (एक्स) iff तर्क एक्स सच लौट भी "अशक्त" वस्तु है।
  • ne (x) और! = (X) सही वापसी अगर if x भी "शून्य" ऑब्जेक्ट नहीं है।
  • isInstanceOf [टी] हमेशा झूठी वापसी करता है।
  • asInstanceOf [टी] scala.AnyRef के अनुरूप होने पर "शून्य" ऑब्जेक्ट स्वयं लौटाता है, और अन्यथा NullPointerException फेंकता है।

"शून्य" ऑब्जेक्ट के किसी भी अन्य सदस्य का संदर्भ NullPointerException को फेंकने का कारण बनता है।

+0

धन्यवाद। तो, 'val msg = if (null eq last) null' को' val msg = n (null == last) null' के साथ प्रतिस्थापित किया जा सकता है, लेकिन 'val msg = if (last == null) null', है ना? – Freewind

+0

@ फ्रीविंड मेरा परीक्षण इंगित करता है कि 'x == null' और' null == x' दोनों क्रमशः 'x eq null' और' null eq x' के रूप में माना जाता है। (मुझे एक कंपाइलर अनुकूलन के रूप में विश्वास है)। "आउट" लगता है कि एकमात्र मामला 'x == y' है, जहां x * * शून्य के लिए मूल्यांकन नहीं करता है - उस मामले में (और केवल उस मामले में) बराबर विधि लागू की जाती है। हालांकि, भले ही बराबर * * x == y' में शून्य होने का मूल्यांकन नहीं किया जाता है, तो संकलक कुशल बाइटकोड के रूप में उत्पन्न करने में सक्षम नहीं हो सकता है क्योंकि जब 'null' ऑपरेंड में से एक के रूप में प्रकट होता है क्योंकि यह नहीं करता है यह नहीं पता कि 'x' शून्य पर मूल्यांकन करेगा। –

+0

फिर से धन्यवाद! तो, मैं कोड की उस पंक्ति के लिए 'val msg =' (null == last) null' और 'val msg = if (last == null) null' दोनों लिख सकता हूं। – Freewind

0

स्केला में ऑपरेटर == जावा के से अलग है।

स्केला में, == किसी में equals विधि के लिए equivant है, eq

Btw, जावा में == को equivant है क्यों नहीं देता है null.asInstanceOf [इंट], null.asInstanceOf [डबल], null.asInstanceOf [बूलियन], null.asInstanceOf [चार] NullPointerException फेंक?

+0

"लगभग बराबर"। मेरे जवाब में मामलों को देखें जो दिखाते हैं कि मैपिंग पूरी तरह से 1-1 नहीं है। एक * नया * प्रश्न wrt पोस्ट करने पर विचार करें। 'AsInstanceOf'। चूंकि 'Int' "" AnyRef' के अनुरूप नहीं है, मुझे यकीन नहीं है कि यह एनपीई क्यों नहीं फेंकता है। –

+0

मैंने एक प्रश्न पोस्ट किया है http://stackoverflow.com/questions/8285916/why-doesnt-null-asinstanceofint-throw-a-nullpointerexception –

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