Scala 巡禮

案例類別

語言

案例類別就像一般類別,有幾個我們將會探討的關鍵差異。案例類別適用於建模不可變資料。在巡禮的下一步,我們將看到它們如何在 模式比對 中發揮作用。

定義案例類別

一個最小的案例類別需要關鍵字 case class、一個識別碼和一個參數清單(可以是空的)

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

儘管通常會省略,但可以明確使用 new 關鍵字,例如 new Book()。這是因為案例類別預設有一個 apply 方法,負責物件建構。

當您建立一個帶有參數的案例類別時,這些參數是公開的 val

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("[email protected]", "[email protected]", "Ça va ?")

println(message1.sender)  // prints [email protected]
message1.sender = "[email protected]"  // this line does not compile

您無法重新指定 message1.sender,因為它是一個 val(即不可變)。可以在案例類別中使用 var,但並不建議這麼做。

比較

案例類別的實例會依結構比較,而非依參考

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("[email protected]", "[email protected]", "Com va?")
val message3 = Message("[email protected]", "[email protected]", "Com va?")
val messagesAreTheSame = message2 == message3  // true

即使 message2message3 參考不同的物件,每個物件的值都是相等的。

複製

只要使用 copy 方法,就可以建立案例類別實例的(淺層)副本。您可以選擇變更建構函式的引數。

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("[email protected]", "[email protected]", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "[email protected]")
message5.sender  // [email protected]
message5.recipient // [email protected]
message5.body  // "Me zo o komz gant ma amezeg"

message4 的收件者用作 message5 的寄件者,但 message4body 已直接複製。

更多資源

此頁面的貢獻者