স্কেল: নীল বনাম তালিকা ()


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
"Eq" ইতিমধ্যে কী বলেছে তা স্পষ্ট করতে সিস্টেম.ডিনিটিটিহ্যাশকোড যুক্ত হয়েছে - তারা একই জিনিস।
জেমস আইরি

18
তদতিরিক্ত, নীল সরাসরি কোনও বস্তুর উল্লেখ করে, যেখানে তালিকা () একটি মেথড কল।
জিন-ফিলিপ পেলিট

6
নয় List[A]()(যদিও Nil) foldLeft জন্য একটি সঁচায়ক মান হিসাবে প্রয়োজনীয়? উদাহরণ - এখানে সংগ্রহকারী হিসাবে 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 :: নীল কেন কাজ করে তবে
ভাঁজগুলির

2
@FUD ওয়েল, y :: x না হবে। সমস্যাটি হ'ল এটি যে ধরণের প্রত্যাশায় প্রত্যাশিত প্রকার নয়। এটি প্রত্যাবর্তন করে List[Int], প্রত্যাশিত প্রকারটি হয় হয় List[Nothing]অথবা Nil.type(আমার মনে হয় পূর্ববর্তী, তবে সম্ভবত পরে)।
ড্যানিয়েল সি সোব্রাল

27

ব্যবহারকারী অজানা এর উত্তর দেখায়, তারা একই জিনিস।

আইডোমেটিকভাবে নীলকে পছন্দ করা উচিত কারণ এটি দুর্দান্ত এবং সংক্ষিপ্ত। যদিও এর ব্যতিক্রম আছে: যদি আমি মনে করি কোনও কারণেই যদি একটি সুস্পষ্ট ধরণের প্রয়োজন হয়

List[Foo]() 

চেয়ে ভাল হয়

Nil : List[Foo]

36
List.empty[Foo]তৃতীয় বিকল্প হিসাবে আছে ।
kassens
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.