scala - scala中空特征的目的是什么

标签 scala

在play框架的Action.scala中,它有如下代码,为什么它定义了一个没有任何方法或字段的特征“处理程序”,定义一个空特征的目的或好处是什么?

trait Handler

/**
 * A handler that is able to tag requests. Usually mixed in to other handlers.
 */
trait RequestTaggingHandler extends Handler {
  def tagRequest(request: RequestHeader): RequestHeader
}

最佳答案

基于@user2864740

一个简单的例子。 (这只是一个用例)

让我们为简单的表达式定义一个数据结构。我们希望数字的存在和结合表达式的加号。

trait Expression

case class Number(i: Int) extends Expression
case class Plus(e1: Expression, e2: Expression) extends Expression

现在为了评估 Expression ,我们定义一个这样的方法。

def evaluate(e: Expression): Int = e match {
  case Number(i) => i
  case Plus(e1, e2) => evaluate(e1) + evaluate(e2)
}

因为我们有 Expression作为 Plus 的参数, 我们可以把 PlusNumber在里面。

val myExpression = Plus(Plus(Number(1),Number(2)), Number(4))
evaluate(myExpression) //yields 7

我们只是将空 trait 用作 Number 的常见父类(super class)型(连接)。和 Plus ,使我们能够对 evaluate 进行模式匹配并使用 Plus里面 Plus . 我希望这不会太困惑。

关于scala - scala中空特征的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216788/

相关文章:

scala - 为具有 transient scala 依赖的 spring-xd 项目优化 gradle

scala - 使用 scalaz 的开源项目示例

scala - 如何使用 saveAsTextFile 在 spark 数据框中进行自定义分区

javascript - 重定向到 .scala.html 文件(Scala Play)仅显示纯文本

Scala for 同时循环遍历两个列表

scala - `if` 语句的返回类型是什么

java - Scala 中的快速排序与 java.util.Arrays.sort

scala - log4j2.properties 调整以仅为 Spark 设置特定的日志级别

scala - 如何在 Squeryl 中的列组合中唯一索引

scala - 如何通过在 Scala 中从 Double 舍入来创建 BigInt