我对 Scala 很陌生,所以请不要投票给我。表达this: Visitor[Double] ⇒
是什么意思?对我来说,它看起来像不完整的代码。我试图在谷歌上找到这个概念,但由于我不知道这个概念名称,我无法找到它。
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)
}
}
this: Visitor[Double] ⇒
Self Type
在 Scala 中称为 a 。它的文档可以在这里阅读。
在这个例子中,这意味着任何实现的类也PrefixNotiationForExpressions
必须实现Visitor[String]
.
Java 中没有与 Self Types 等效的东西。关于它们的最常见问题是为什么不在 trait 的 extends 子句中声明类型。下面的 StackOverflow 参考很好地解释了这一点:self-types 和 trait subclasses 之间有什么区别?. 核心区别归结为我们是表示“是”关系还是“需要”关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句