2012-01-30 12 views
5

के लिए विभिन्न प्रकार देता है, तो मैं स्काला आरईपीएल में निम्नलिखित अभिव्यक्ति का मूल्यांकन:स्काला बहुत समान भाव

scala> "1" + 1 
res0: java.lang.String = 11 

लौटे प्रकार है: java.lang.String

यदि मैं यह समान अभिव्यक्ति का मूल्यांकन:

scala> 1 + "1" 
res1: String = 11 

लौटे प्रकार है: स्ट्रिंग

अंतर क्यों?

+2

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/6559938/scala-string-vs-java-lang-string-type-inference –

+3

स्कैला 2.10 में दोनों 'स्ट्रिंग' लौटाएं। – soc

उत्तर

14

कोई फर्क नहीं पड़ता, हालांकि यह भी एक बग नहीं है। इस मामले में:

"1" + 1 

आप स्ट्रिंग में कुछ भी जोड़ने के लिए जावा की अंतर्निहित सुविधा का उपयोग कर रहे हैं। सब के बाद, कई लोगों को निम्नलिखित "मुहावरा" का उपयोग करने के लिए तार संख्या बदलती है:

String s = "" + 5; 

यह रूप में अच्छी तरह स्काला में काम करता है और java.lang.String के साथ परिणाम - जावा में के रूप में ही।

दूसरी ओर:

1 + "1" 

में थोड़ा और अधिक जटिल है। इस में अनुवाद किया जाता है:

1.+("1") 

और +() विधि Int.+ विधि Int.scala में स्थित से लिया जाता है:

final class Int extends AnyVal { 
    //.... 
    def +(x: String): String = sys.error("stub") 

String इस संदर्भ में Predef.scala में परिभाषित किया गया है:

type String  = java.lang.String 

जो प्रकार का स्रोत है "अंतर "। जैसा कि आप देख सकते हैं कि दोनों तार वास्तव में एक ही प्रकार के हैं।

2

"1"+1 invokes java.lang.String के ऑपरेटर +, 1+"1" एक ऑपरेटर का आह्वान + स्केला क्रम से परिभाषित किया गया है (यह अभी नहीं मिल सकता है), इसलिए यह एक स्केला स्ट्रिंग देता है।