Scala Case类

Case类和常规类有几个关键差异。Case类适用于模型化不可变数据。之后会在模式匹配中展示如何使用Case类。

定义Case类

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

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意,下面的示例没有使用new关键字实例化Message这个Case类。这是因为Case类默认有一个apply方法用于对象构造。

当使用参数创建Case类时,参数是public val

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重新赋值,因为它时val(不可变的)。也可以在Case类中使用var,但是不建议这样做。

比较

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"

message4的收件人成为message5的发件人,但是message4的body被直接拷贝了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值