2010-08-18 8 views
19

मैं हाल ही में स्काला (2.8) के साथ खेलना शुरू कर दिया है और पाया है मैं निम्नलिखित कोड (स्काला दुभाषिया में) लिख सकते हैं किया है:स्कैला: मैं इंट टू यूनिट क्यों बदल सकता हूं?

scala> var x : Unit = 10 
x : Unit =() 

यह स्पष्ट वहाँ क्या हो रहा है नहीं है। मुझे वास्तव में यूनिट पर कोई अंतर्निहित रूपांतरण देखने की उम्मीद नहीं थी।

उत्तर

30

देखें अनुभाग "6.26.1 मूल्य रूपांतरण"Scala Language Specification संस्करण 2.8 में:

...

मूल्य डिस्कार्डिंग। यदि e में कुछ मूल्य प्रकार है और अपेक्षित प्रकार यूनिट है, e को { e;() } शब्द में एम्बेड करके अपेक्षित प्रकार में परिवर्तित किया गया है।

...

+0

ध्यान दें कि आप एसबीटी कॉन्फ़िगरेशन में 'scalacOptions + =" -Ywarn-value-discard "का उपयोग कर इसके लिए चेतावनी दे सकते हैं। – VasyaNovikov

0

ठीक है, कुछ भी इकाई में परिवर्तित किया जा सकता है (जिसका उद्देश्य है)। आप यूनिट के रूप में यूनिट के रूप में (उप) प्रकारों की जाली में सोच सकते हैं, जिसका अर्थ है कि यह सबकुछ का एक सुपरटेप है। Wikipedia article देखें।

+2

के लिए यह स्पष्ट नहीं है मेरे लिए वास्तव में तुम यहाँ क्या मतलब है: यूनिट वास्तव में स्काला में टाइप जाली है, जो किसी भी प्रकार है की कम से कम तत्व नहीं है। यूनिट में वास्तव में स्कैला में कोई उपप्रकार नहीं है, जहां तक ​​मैं कह सकता हूं, इसे परिभाषित किया गया है "अंतिम श्रेणी इकाई AnyVal बढ़ाती है"। ऊपर mkneissl का उत्तर यह काम करने का वास्तविक कारण देता है - अंतर्निहित रूपांतरण। क्या आपका मतलब यह है कि यह (उप) प्रकारों की जाली कहने में विशिष्ट है? – iainmcgin

+1

यह उत्तर गलत है। – Jubobs

15

कुछ भी इकाई में परिवर्तित किया जा सकता है। साइड-इफेक्टिंग विधियों का समर्थन करने के लिए यह अधिक आवश्यक है, फिर भी मूल्यों को वापस कर दें, लेकिन जहां वापसी मूल्य को अक्सर अनदेखा किया जाता है। उदाहरण

import java.util.{List =>JList} 

def remove2[A](foo: JList[A], a1:A, a2:A):Unit = { 
    foo.remove(a1) 
    foo.remove(a2) //if you couldn't convert the (usually pointless) return value of remove to Unit, this wouldn't type 
} 
संबंधित मुद्दे