2015-02-15 3 views
20

नीचे दिए गए कोड को संकलित नहीं किया गया है यदि मैं इंगित लाइन को अनदेखा करता हूं। संकलक शिकायत करता है: "स्थिर पहचानकर्ता आवश्यक"।स्कैला में Stream.empty पर पैटर्न क्यों नहीं मिल सकता?

val Empty = Stream.empty  
val a = Stream.range(0, 5) 
a match { 
    // case Stream.empty => println("nope") <-- does not work 
    case Empty => println("compiles") <-- works 
    case _ => println("ok") 
} 

अगर मैं Stream.empty आवंटित पहले Empty मूल्य, यह काम करता है, लेकिन यह इस तरह के एक हैक के बिना आप इस तरह के एक बुनियादी मूल्य पर पैटर्न मैच नहीं कर सकते हैं कि अजीब लगता है।

क्या मुझे कुछ याद आ रही है?

उत्तर

38

आप Stream.empty पर पैटर्न मैच है क्योंकि यह एक विधि (वस्तु Stream में) है कि हमेशा खाली धारा देता है (लेकिन संकलक कि पता नहीं है) नहीं कर सकता। val empty = Stream.empty देने की

इसके बजाय, आप Stream.Empty पर मिलान कर सकते हैं, जो कि एक Object:

scala> a match { 
      case Stream.Empty => println("done") 
      case h #:: tl => println(h) 
     } 
+7

'मामले स्ट्रीम() =>' भी काम करता है –

5

आप चर पर "पैटर्न मिलान" नहीं कर सकते हैं जो स्थिर नहीं है।

/** The empty stream */ 
    override def empty[A]: Stream[A] = Empty 

है कि संभावित किसी भी समय कोई मूल्य वापस कर सकते हैं:
Stream.empty एक "स्थिर" पहचानकर्ता के बाद से यह कुछ विधि का प्रतिनिधित्व करता है नहीं है।
कंपाइलर को पता नहीं है कि इसका लौटा मूल्य हमेशा Empty है, इसलिए यह इसे संभावित बदलते परिवर्तनीय के रूप में पहचानता है।
इसका पता लगाने के लिए बहुत गहराई है।

हालांकि, जब आप val (अपरिवर्तनीय के बाद स्थिर पहचानकर्ता होने के लिए विधि का परिणाम असाइन करते हैं), तो आपका कोड इसका उपयोग करके पैटर्न मिलान करने की प्रक्रिया में सक्षम है।

आप this पढ़ सकते हैं, जो एक अनुमान लगाते हुए बताते हैं कि पैटर्न मिलान स्थिर पहचानकर्ता की अपेक्षा क्यों करता है।

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