我是斯卡拉的新手。 到目前为止,我了解到,scala中的对象是单例,如果我们声明case对象,那么还会添加override和hashcode默认实现。
只是想知道找到任何简单的实际例子,我们可以在其中拟合案例对象。
修改1:
@Aivean: -
但是如果没有声明对象的情况,下面的代码也可以正常工作: -
object ScalaPractice {
def main(args: Array[String]): Unit = {
val trade1 = Trade(EUR)
trade1.currency match{
case EUR | USD => println("trade possiblein this currency : " + trade1.currency)
case _ => println("trade not possible")
}
}
}
case class Trade(val currency : Currency){
}
sealed trait Currency { def name: String }
object EUR extends Currency { val name = "EUR" }
object USD extends Currency { val name = "USD" }
为什么需要添加案例?
编辑2:
@dwickern
@dwickern 引用: -
将对象转换为案例对象可以得到:
scala网站上是否有任何官方文档,scal docs等。(特别是第三点,粗体斜体)
答案 0 :(得分:2)
将object
转换为case object
会给您:
toString
实施case object
自动实施Serializable
。这很重要,例如当通过akka remoting将这些对象作为消息传递时例如:
case object USD
object EUR
println(USD) // USD
println(EUR) // testapp$EUR$@edf4efb
val oos = new ObjectOutputStream(new ByteArrayOutputStream())
oos.writeObject(USD)
oos.writeObject(EUR) // java.io.NotSerializableException
您也可以像equals
一样获得默认hashCode
,scala.Product
和case class
实施,但这些实际上并不重要
答案 1 :(得分:0)
一个很好的例子是 actor 模型。这里case对象可以表示要发送给actor的消息:
case object Start
someActorRef ! Start
此对象不包含任何仅用于消息传递协议的数据 - 表示actor应该执行一些启动逻辑。
另一个例子是,如果您编写用于远程控制的API,您的API可以采用以下命令:左转,右转等。将这些命令实现为案例对象可能是个好主意 - 它们没有任何州:
case object Left
case object Right
case object Up
case object Down
答案 2 :(得分:0)
sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "EUR" }
case object USD extends Currency { val name = "USD" }
检查Nil
的{{1}}:
scala.collection.immutable