2012-03-16 12 views
10

मुझे उम्मीद है कि (String, String) मामले में Pair में मुझे एक प्रकार की त्रुटि देने की उम्मीद है।यह एक प्रकार की त्रुटि क्यों नहीं देता है?

case class Pair(x: String, y: String) 

val value = Console.readLine.toBoolean 

val Pair(x, y) = 
    if (value) Pair("foo", "bar") 
    else false 

इसके बजाय, अगर मैं गलत दर्ज करता हूं, तो मुझे रन टाइम पर निम्न त्रुटि मिलती है।

scala.MatchError: (foo,bar) (of class scala.Tuple2) 

मुझे लगता है विखंडन बस प्रकार Any के एक चर के लिए परिणाम बताए और फिर उस पर मिलान के लिए चीनी है, लेकिन यह दुर्भाग्यपूर्ण है कि स्काला इस मक्खी की सुविधा देता है।

उत्तर

7

यदि आप इस कोड को scalac -print के साथ संकलित करते हैं तो आप देखते हैं, क्या होता है। जैसा कि आपने सही ढंग से माना है, यह एक पैटर्न मिलान के लिए सिर्फ वाक्य रचनात्मक चीनी है। असल में आपका केस क्लास उत्पाद बढ़ाता है, जो टुपले 2 का सुपरक्लास भी है और यही वह कोड है जो आपका कोड संकलित करता है। आपका मान प्रकार उत्पाद के एक चर को सौंप दिया जाता है:

val temp6: Product = if (value) 
     new Main$Pair("foo", "bar") 
    else 
     new Tuple2("foo", "bar"); 

और फिर एक पैटर्न मिलान लागू किया जाता है इसे करने के लिए:

if (temp6.$isInstanceOf[Main$Pair]()) 
{ 
    <synthetic> val temp7: Main$Pair = temp6.$asInstanceOf[Main$Pair](); 
    new Tuple2(temp7.x(), temp7.y()) 
} 
else 
    throw new MatchError(temp6) 

लेकिन nontheless इस imho संकलन नहीं करना चाहिए। आपको इसे स्कैला मेलिंग सूची में पोस्ट करना चाहिए।

+0

मुझे यह आदेश याद रखना होगा ('scalac')! – schmmd

+0

यह जानना अच्छा है, लेकिन मुझे नहीं लगता कि 'उत्पाद' का सामान्य सुपरटेप यह क्यों संकलित करता है। मैंने इसे दिखाने के लिए अपना उदाहरण बदल दिया, हालांकि दोनों के पास अभी भी एक सामान्य सुपर प्रकार 'Any' है! – schmmd

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