2013-05-18 8 views
6

लौटे मैं अनगिनत वेबसाइटों पर कोड के इस प्रकार देखा है फिर भी यह संकलन नहीं लगता है:स्काला नहीं मिला: मान x जब unpacking टपल

def foo(): (Int, Int) = { 
     (1, 2) 
} 

def main(args: Array[String]): Unit = { 
     val (I, O) = foo() 
} 

यह उल्लेखनीय लाइन पर विफल रहता है, उन्हें रिपोर्ट करना:

  • नहीं मिला: मूल्य मैं
  • नहीं मिला: मूल्य हे

क्या इस का कारण हो सकता है?

+7

ऐसा इसलिए है क्योंकि वे पूंजी पत्र हैं। Http://stackoverflow.com/questions/2727612/scalas-tuple-unwrapping-nuance की जांच करें। 'वैल (i, o) = foo' काम करेगा। – Chirlo

उत्तर

8

समस्या आपके पैटर्न मिलान में ऊपरी केस अक्षरों I और O का उपयोग है। आपको इसे लोअरकेस अक्षरों val (i, o) = foo() द्वारा प्रतिस्थापित करने का प्रयास करना चाहिए। Scala Language Specification बताता है कि एक मान परिभाषा को पैटर्न मिलान में विस्तारित किया जा सकता है।

val x$ = mylist match { case x :: xs => {x, xs} } 
val x = x$._1 
val xs = x$._2 

आपके मामले में, मूल्य परिभाषा val (i, o) = foo() एक समान तरीके से विस्तार किया है: उदाहरण के लिए परिभाषा val x :: xs = mylist निम्नलिखित (। Cf. पी 39) को विस्तृत करता है। हालांकि, भाषा विनिर्देश भी कहा गया है, कि एक पैटर्न मैच लोअर केस अक्षरों में शामिल है (cf. पी 114।):

एक चर पैटर्न एक्स एक सरल पहचान फाई एर जो एक कम मामले अक्षर से शुरू होता है।

3

स्काला naming convention के अनुसार,

विधि, मूल्य और चर नाम पहले पत्र लोअर केस के साथ CamelCase में होना चाहिए:

आपका I, O पैटर्न चर हैं। हालांकि, उन्हें परिभाषित करते समय आपको सावधानी बरतनी होगी। सम्मेलन से, स्काला अपेक्षा करता है कि पैटर्न चर को लोअरकेस अक्षर से शुरू किया जाए और स्थिरांक को अपरकेस अक्षर से शुरू करने की अपेक्षा करता है। तो, कोड संकलित नहीं होगा।

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