2012-10-12 30 views
9

मेरी समझ Unit = void है, लेकिन मैं एकाधिक तर्क में क्यों जा सकता हूं?निम्नलिखित स्कैला कोड मान्य क्यों है?

तो क्या कोई यह समझा सकता है कि निम्न कोड मान्य क्यों है?

def foo(x: Unit) = println("foo")     
foo("ss", 1) 
+2

आप इकाई प्रकार का पैरामीटर क्यों बना रहे हैं? यदि आप पैरामीटर नहीं चाहते हैं तो बस 'def foo() 'करें। – sourcedelica

उत्तर

19

आप scala -print के साथ अपने टुकड़ा चलाते हैं तो आप मोटे तौर पर कोड के लिए निम्न उत्पादन मिल जाएगा:

/* Definition of foo */ 
private def foo(x: scala.runtime.BoxedUnit): Unit = { 

/* Invocation of foo */ 
foo({ 
    new Tuple2("ss", scala.Int.box(1)); 
    scala.runtime.BoxedUnit.UNIT 
}); 

आप देख सकते हैं, foo तर्क है कि बनाता है एक कोड ब्लॉक में दोबारा लिखे जाने पर एक ट्यूपल लेकिन फिर यूएनआईटी लौटाता है।

मुझे इस व्यवहार के लिए एक अच्छा कारण नहीं दिख रहा है और मैं इसके बजाय एक संकलक त्रुटि फेंक दूंगा।

+2

यदि आप 'foo (x: (स्ट्रिंग, Int)) को परिभाषित करते हैं, तो आप इसे ऊपर की तरह तर्कों की एक जोड़ी के साथ कॉल कर सकते हैं, जो स्वचालित रूप से tupled हैं। चूंकि कुछ भी 'यूनिट' के लिए पारित किया जा सकता है, ऐसा लगता है कि टुपल रूपांतरण ठीक उसी तरीके से उचित है जैसा आपने प्रदर्शित किया है। मुझे यकीन नहीं है कि मुझे यह पसंद है, लेकिन शायद गलती सामान्य रूप से ऑटो-टुपलिंग के साथ है? –

5

इससे संबंधित एक सवाल जो इस के लिए एक सभ्य जवाब देता है यहाँ है:

Scala: Why can I convert Int to Unit?

Scala Language Specification v2.9 की, "मान डिस्कार्डिंग" धारा 6.26.1 से:

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

तो, आपके मामले में ऐसा लगता है ("एसएस", 1) को एक टुपल में परिवर्तित किया जा रहा है ताकि इसे एक तर्क के रूप में माना जा सके, क्योंकि उस तर्क प्रकार इकाई नहीं है, इसे परिवर्तित किया जाता है एक ब्लॉक जो उस ट्यूपल मान की गणना करता है, फिर आवश्यक प्रकार के पैरामीटर के साथ मिलान करने के लिए यूनिट देता है।

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