我想学习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
被称为代数数据类型。它们是创建 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
上没有任何字段,我们可以创建该类型的单个表示形式。
有人可以用简单的语言向我解释以上答案吗?