स्काला: निल बनाम सूची ()


128

स्काला में, क्या सभी के बीच Nilऔर में कोई अंतर है List()?

यदि नहीं, तो कौन सा अधिक मुहावरेदार स्काला शैली है? दोनों नई खाली सूची बनाने और खाली सूची पर पैटर्न मिलान के लिए।

जवाबों:


188
scala> println (Nil == List())
true

scala> println (Nil eq List())
true

scala> println (Nil equals List())
true

scala> System.identityHashCode(Nil)
374527572

scala> System.identityHashCode(List())
374527572

नील अधिक मुहावरेदार है और ज्यादातर मामलों में पसंद किया जा सकता है। प्रशन?


11
आप उल्लेख कर सकते हैं कि Nilअधिक मुहावरेदार है।
रेक्स केर

6
जोड़ा गया System.identityHashCode स्पष्ट करने के लिए कि "eq" पहले से ही क्या कहता है - वे एक ही वस्तु हैं।
जेम्स आइरी

18
इसके अलावा, निल एक वस्तु को सीधे संदर्भित करता है, जबकि सूची () एक विधि कॉल है।
जीन-फिलिप पेलेट

6
फोल्डेफ़्ट के लिए संचायक मान के रूप में आवश्यक नहीं है List[A]()(नहीं Nil)? उदाहरण - यहाँ संचायक के रूप में scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)उपयोग Nilकरने से काम नहीं चलेगा।
केविन मेरेडिथ

6
Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
राउल

85

उपयोगकर्ता अज्ञात ने दिखाया है कि दोनों का रन टाइम मूल्य Nilऔर List()समान है। हालाँकि, उनका स्थिर प्रकार नहीं है:

scala> val x = List()
x: List[Nothing] = List()

scala> val y = Nil
y: scala.collection.immutable.Nil.type = List()

scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean

scala> cmpTypes(x, y)
res0: Boolean = false

scala> cmpTypes(x, x)
res1: Boolean = true

scala> cmpTypes(y, y)
res2: Boolean = true

यह विशेष महत्व का है जब इसका उपयोग एक प्रकार का अनुमान लगाने के लिए किया जाता है, जैसे कि गुना संचयकर्ता में:

scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
res6: List[Int] = List(3, 2, 1)

scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
 found   : List[Int]
 required: scala.collection.immutable.Nil.type
       List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
                                               ^

मुझे समझ में नहीं आता है कि 2 :: निल काम क्यों नहीं करता है, लेकिन फोल्ड का संचायक y :: x
FUD

2
@ फड वेल, काम y :: x करता है । समस्या यह है कि यह जिस प्रकार का रिटर्न देता है वह अपेक्षित प्रकार नहीं है। यह लौटता है List[Int], जबकि अपेक्षित प्रकार List[Nothing]या तो है Nil.type( या मुझे लगता है कि पूर्व, लेकिन शायद बाद वाला)।
डैनियल सी। सोबरल

27

जैसा कि उपयोगकर्ता अज्ञात जवाब दिखाता है, वे एक ही वस्तु हैं।

आदर्श रूप से निल को पसंद किया जाना चाहिए क्योंकि यह अच्छा और छोटा है। हालांकि एक अपवाद है: अगर मुझे लगता है कि जो भी कारण के लिए एक स्पष्ट प्रकार की आवश्यकता है

List[Foo]() 

से अच्छा है

Nil : List[Foo]

36
List.empty[Foo]तीसरे विकल्प के रूप में भी है ।
कासेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.