Scala 游览

用例类

语言

用例类就像常规类,有一些关键区别,我们将在下面讨论。用例类非常适合建模不可变数据。在游览的下一步,我们将看到它们在 模式匹配 中如何有用。

定义用例类

一个最小的用例类需要关键字 case class、一个标识符和一个参数列表(可以为空)

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

尽管通常省略,但可以明确使用 new 关键字,如 new Book()。这是因为用例类默认有一个 apply 方法,它负责对象构造。

当您使用参数创建 case 类时,这些参数是公有的 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(即不可变)。可以在 case 类中使用 var,但这不推荐。

比较

case 类的实例是按结构而不是按引用进行比较的

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 类实例的(浅)副本。您可以选择更改构造函数参数。

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 已直接复制。

更多资源

此页面的贡献者