2014-06-30 8 views
7

In scala Quelle, fand ich:Warum `Nil` als` Fall definiert object`

case object Nil extends List[Nothing] { 
    ... 
} 

Ich kann nicht verstehen, warum es als case object erklärt wird, statt object?

fand ich diese Frage [Difference between case object and object] nützlich ist, und ich denke, aus diesem Grund ist der Schlüssel:

Standardimplementierungen von Serialisierung

weil wir oft senden Liste der Daten an einen anderen Akteur, Also muss Nil serialisierbar sein, oder?


Mit den gegebenen Antworten (danke), ich versuche, einige Code zu schreiben, um es zu überprüfen:

trait MyList[+T] 

object MyNil extends MyList[Nothing] 

val list: MyList[String] = MyNil 

list match { 
    case MyNil => println("### is nil") 
    case _ => println("### other list") 
} 

Sie können sehen, MyNil nicht case object ist, aber ich kann es immer noch in Musterabgleich verwenden. Hier ist der Ausgang:

### is nil 

Versteh ich etwas falsch?

Antwort

2

Wie in den Kommentaren dieser verbundenen Frage erwähnt, Sie erhalten eine Sache ist ein schönes .toString Ergebnis

scala> MyNil.toString 
res0: String = [email protected] 

scala> case object MyNil2 extends MyList[Nothing] 
defined module MyNil2 

scala> MyNil2.toString 
res2: String = MyNil2 

scala> Nil.toString 
res1: String = List() 
5

Im Allgemeinen für unveränderliche Daten, soll die Frage nie Gegenstand dies ein Falles, „warum ist (oder Klasse) "aber eher" Kann ich dies ein Fallobjekt machen? ". Mit ein paar kleinen Ausnahmen (hauptsächlich aufgrund von Vererbung) sollten Datenelemente in Scala unveränderlich sein und über Fallklassen/Objekte implementiert werden. Vor diesem Hintergrund ist die Implementierung von Nil und :: als Fallobjekt und Fallklasse (bzw.) nur eine übliche Praxis, für die es keinen Nachteil gibt.

Verwandte Themen