Scala 空类、对象、特征

问题描述 投票:0回答:2

我想学习scala语言
在许多文档或视频教程中,我看到 Scala 开发人员创建空类或对象并将其用作另一个类的参数或实现空特征!
例如:

object Controller {
  sealed trait Controller
  case object Login extends Controller
  case object Logout extends Controller
}

或者这个:

sealed trait Expression
case class Number(num: Int) extends Expression
case class Plus(a: Expression, b: Expression) extends Expression
case class Minus(a: Expression, b: Expression) extends Expression

object ExpressionEvaluate {
  def value(expression: Expression): Int = expression match {
    case Number(value) => value
    case Plus(a, b) => value(a) + value(b)
    case Minus(a, b) => value(a) - value(b)
  }
}

我想知道这个图案是什么?
空类、对象或特征是什么意思?
为什么开发人员使用这种模式?

scala
2个回答
6
投票

这个图案:

sealed trait Controller
case object Login extends Controller
case object Logout extends Controller

或者这个

sealed trait Expression
case class Number(num: Int) extends Expression
case class Plus(a: Expression, b: Expression) extends Expression
case class Minus(a: Expression, b: Expression) extends Expression

被称为代数数据类型。它们是创建 co-product/sum types(也称为标记联合)的 Scala 方法。当您在签名中收到

Expression
类型的特征时,您知道您将收到其中一个具体实现。您发现哪种类型是具体类型的方法是通过模式匹配,这是匹配类型的能力。更重要的是,编译器足够聪明,带有
sealed trait
以了解其所有底层具体类型,并在您的模式匹配不详尽的情况下通知您,例如,如果我添加一个
Divide
类型:

case class Divide(a: Expression, b: Expression) extends Expression

然后编译,编译器会报错:

Warning:(18, 48) match may not be exhaustive.
It would fail on the following input: Divide(_, _)
      def value(expression: Expression): Int = expression match {

对于“空类”,我们要区分两种类型。一个是

case class
。案例类是在 Scala 中创建不可变记录类型的一种方式,可以将它们视为类固醇的产品类型。在这些类中,编译器自动派生出
hashCode
equals
的实现,并且还添加了当我们通过
apply
/
unapply
进行模式匹配时为我们提供语法糖的方法。例如:

case Number(value) => value

你看到我们能够在模式匹配中访问

value
上的
Number
字段,这怎么可能?这是可能的,因为编译器为我们提供了一个
unapply
方法,用于解构案例类。

另一个是

case object
,这是一种在Scala 中创建单例类型(一种只表示一个值的类型)的方法。由于我们在
Login
Logout
上没有任何字段,我们可以创建该类型的单个表示形式。


-1
投票

有人可以用简单的语言向我解释以上答案吗?

© www.soinside.com 2019 - 2024. All rights reserved.