Scala空的类、对象、特征

Scala空的类、对象、特征,scala,Scala,我想学习scala语言。 在许多文档或视频教程中,我看到scala开发人员创建一个或多个空类或对象,并将其用作另一个类的参数或实现空特性 例如: object Controller { sealed trait Controller case object Login extends Controller case object Logout extends Controller } 或者这个: sealed trait Expression case class Number(n

我想学习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)
  }
}
我想知道这种模式是什么?
什么是空类、空对象或空特征?
开发人员为什么使用此模式?

此模式:

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
被称为。它们是创建(也称为标记的联合)的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类是在Scala中创建不可变记录类型的一种方法,可以将它们看作是一种类固醇。在这些类中,编译器自动派生出
hashCode
equals
的实现,并且还添加了一些方法,当我们通过
apply
/
进行模式匹配时,这些方法为我们提供语法糖。例如:

case Number(value) => value
您可以看到,我们可以访问模式匹配中
Number
上的
value
字段,这怎么可能?这是可能的,因为编译器提供了一个
unapply
方法,用于解构case类

另一个是
case对象
,它是在Scala中创建一个(只表示一个值的类型)的方法。由于我们在
登录
注销
上没有任何字段,因此我们可以创建该类型的单一表示