gpt4 book ai didi

Scala 空类、对象、特征

转载 作者:行者123 更新时间:2023-12-05 00:51:29 25 4
gpt4 key购买 nike

我想学习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

被称为 algebraic data types .它们是创建 co-product/sum types 的 Scala 方式(也称为标记联合)。当您收到类型为 Expression 的特征时在您的签名中,您知道您将收到其中一个具体实现。您发现哪种类型是具体类型的方法是通过 pattern matching ,这是匹配类型的能力。更重要的是,编译器足够聪明,带有 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 . case 类是在 Scala 中创建不可变记录类型的一种方式,将它们视为 product type类固醇。在这些类中,编译器会自动派生 hashCode 的实现。和 equals ,并且还添加了在我们通过 apply 进行模式匹配时为我们提供语法糖的方法。/ unapply .例如:
case Number(value) => value

您会看到我们能够访问 value字段上 Number在模式匹配中,这怎么可能?这是可能的,因为编译器为我们提供了一个 unapply用于解构案例类的方法。

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

关于Scala 空类、对象、特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com