Scala奇怪的代码不理解: Visitor[String] ⇒

5 浏览
0 Comments

Scala奇怪的代码不理解: Visitor[String] ⇒

这个问题已经有答案了:

self-types和trait子类有什么区别?

我非常新手Scala,请不要投票。 this: Visitor[Double] ⇒ 表达式是什么意思?对我来说看起来像是不完整的代码。我试图在Google上找到这个概念,但由于我不知道这个概念的名称,我无法找到它。

import scala.language.higherKinds
trait Expressions {
  trait TVisitor[T] {
    def visitConstant(v: Double): T
  }
  type Visitor[T] <: TVisitor[T]
  trait Expression {
    def accept[T](visitor: Visitor[T]): T
  }
  class Constant(val v: Double) extends Expression {
    def accept[T](visitor: Visitor[T]): T = visitor.visitConstant(v)
  }
  trait EvalVisitor extends TVisitor[Double] {
    def visitConstant(v: Double): Double = v
  }
}
trait AddExpressions extends Expressions {
  class Add(val l: Expression, val r: Expression) extends Expression {
    def accept[T](visitor: Visitor[T]): T = visitor.visitAdd(l, r)
  }
  trait TVisitor[T] extends super.TVisitor[T] {
    def visitAdd(l: Expression, r: Expression): T
  }
  type Visitor[T] <: TVisitor[T]
  trait EvalVisitor extends super.EvalVisitor with TVisitor[Double] {
    this: Visitor[Double] ⇒
    def visitAdd(l: Expression, r: Expression): Double =
      l.accept(this) + r.accept(this)
  }
}
trait ExtendedExpressions extends AddExpressions with MultExpressions {
  type Visitor[T] = TVisitor[T]
  trait TVisitor[T]
      extends super[AddExpressions].TVisitor[T]
      with super[MultExpressions].TVisitor[T]
  object EvalVisitor
      extends super[AddExpressions].EvalVisitor
      with super[MultExpressions].EvalVisitor
      with TVisitor[Double] {
    this: Visitor[Double] ⇒
  }
}
trait PrefixNotationForExpressions extends ExtendedExpressions {
  object PrefixNotationVisitor extends super.TVisitor[String] {
    this: Visitor[String] ⇒
    def visitConstant(v: Double): String = v.toString + " "
    def visitAdd(l: Expression, r: Expression): String =
      "+ " + l.accept(this) + r.accept(this)
    def visitMult(l: Expression, r: Expression): String =
      "* " + l.accept(this) + r.accept(this)
  }
}

admin 更改状态以发布 2023年5月23日
0
0 Comments

this: Visitor[Double] ⇒ 在Scala中被称为自类型(Self Type)。它的文档可以在此处阅读

在这个例子中,这意味着任何实现PrefixNotiationForExpressions的类也必须实现Visitor[String]

在Java中没有等价的自类型。他们最常见的问题是为什么不在特征的扩展子句中声明类型。以下StackOverflow参考文献非常好地解释了这个问题:什么是自类型和特征子类之间的区别?。核心差异在于我们是表示“is a”关系还是“requires”关系。

0