Scala中的case class

本文的内容源于对Scala官网关于case class的教程的翻译。

CASE CLASSES

Case classes are like regular classes with a few key differences which we will go over. Case类适合作为模式固定的数据模型。在教程的下一章,我们将会看到case类在模式匹配(pattern matching)中的作用。

定义一个case类

case类最简洁的定义方式包含关键词case class、类名称和参数列表(可为空):

case class Book(isbn: String)
val frankenstein = Book("978-0486282114")

注意到实例化Book类没有用关键字new,因为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重新赋值,因为它是个常量。在case类中使用变量(var)也是可以的,不过不建议这样做。

比较

判断两个case类是否相等(==)时,是通过比较它们的结构(structure)而不是引用(reference):

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成了message5sender,而body则被直接拷贝。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值