Scala之旅-Case类

Scala之旅-Case类

Case类(Case Classes)

Case类与regular类类似,但是二者有一些关键的区别。Case类很适合模型化不可变数据。在scala之旅的下一篇,我们将会看到case类在模式匹配中的作用。

定义一个case类

一个最简单的case类需要关键字case class,一个标识符和一个参数列表(参数列表可以是空的):

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意关键字new没有被用来实例化case类。这是因为case类默认具有一个方法apply,由其负责对象构造。

当你使用参数创建case类时,这些参数都是公有值(public vals)。

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")

println(message1.sender)  // prints guillaume@quebec.ca
message1.sender = "travis@washington.us"  // this line does not compile

由于message1.sender是一个值(也就是说它是不可变的),因此无法重新给它赋值。在case类中是可以使用变量的(vars),但是最好不要这样做。

比较

Case类之间做比较是通过对比结构而不是引用:

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

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

即使message2message3引用的是不同对象,但是这两个对象的值是相同的。

复制

可以通过方法copy创建一个case类实例的深拷贝。还可以随意地修改构造函数的参数。

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

message4recipient作为message5sendermessage4body被直接拷贝给message5

参考资料

本文译自Tour Of Scala – Case Classes

上一篇:Scala之旅-柯里化

下一篇:Scala之旅-模式匹配

发表评论

电子邮件地址不会被公开。 必填项已用*标注