Scala 奇怪的代码无法理解这一点:访问者 [String] ⇒

这_

我对 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)
  }
}
克里斯·K

this: Visitor[Double] ⇒Self Type在 Scala 中称为 a 它的文档可以在这里阅读

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

Java 中没有与 Self Types 等效的东西。关于它们的最常见问题是为什么不在 trait 的 extends 子句中声明类型。下面的 StackOverflow 参考很好地解释了这一点:self-types 和 trait subclasses 之间有什么区别?. 核心区别归结为我们是表示“是”关系还是“需要”关系。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法做到这一点... R.Id.“ string”?

来自分类Dev

我可以在Scala中使用“收益”来做到这一点吗?(嵌套循环产生组合向量)

来自分类Dev

在Scala中将Future [Future [(String,String)]]转换为Future [(String,String)]用于理解

来自分类Dev

列表理解如何做到这一点

来自分类Dev

Scala String。包含unicode

来自分类Dev

scala.Some无法转换为java.lang.String

来自分类Dev

无法在 Spark Scala 中将 Seq[String] 传递给 .parquet

来自分类Dev

如何从nashorn中创建一个Scala Seq [String]()?

来自分类Dev

值|| 不是String的成员-scala

来自分类Dev

Scala ByteArrayInputStream转换为String

来自分类Dev

Perl打印%hash-需要一些帮助来理解这一点

来自分类Dev

试图理解这一点:布尔变量是C#中的值类型

来自分类Dev

算法中的行成本有助于我理解这一点

来自分类Dev

Apache Spark-无法理解Scala示例

来自分类Dev

Javascript-无法理解这一行代码

来自分类Dev

如何做到这一点,以便可以从任何类访问此数组?

来自分类Dev

我该如何在访问表格中做到这一点

来自分类Dev

两个共享代码的分支-如何在git中做到这一点?

来自分类Dev

有人可以解释这一点MVVM代码

来自分类Dev

在Scala中将Map [String,String]转换为Map [String,Int]

来自分类Dev

在Scala中将Map [String,String]转换为Map [String,Int]

来自分类Dev

为什么删除的默认构造函数无法捕捉到这一点?

来自分类Dev

Scala:通过Map [String,Any]或更好的替代方法访问/广播条目

来自分类Dev

带有嵌套数据结构的Scala访问Map [String,Any]

来自分类Dev

scala:为什么代码返回List [Any]而不返回List [String]?

来自分类Dev

如何在Scala中从一组String中产生一组Char

来自分类Dev

无法将 String[][] 中的元素包含在 Scala 的单个数据结构中

来自分类Dev

更优雅的方式做到这一点?

来自分类Dev

如何用诺言简化这一点

Related 相关文章

  1. 1

    有没有办法做到这一点... R.Id.“ string”?

  2. 2

    我可以在Scala中使用“收益”来做到这一点吗?(嵌套循环产生组合向量)

  3. 3

    在Scala中将Future [Future [(String,String)]]转换为Future [(String,String)]用于理解

  4. 4

    列表理解如何做到这一点

  5. 5

    Scala String。包含unicode

  6. 6

    scala.Some无法转换为java.lang.String

  7. 7

    无法在 Spark Scala 中将 Seq[String] 传递给 .parquet

  8. 8

    如何从nashorn中创建一个Scala Seq [String]()?

  9. 9

    值|| 不是String的成员-scala

  10. 10

    Scala ByteArrayInputStream转换为String

  11. 11

    Perl打印%hash-需要一些帮助来理解这一点

  12. 12

    试图理解这一点:布尔变量是C#中的值类型

  13. 13

    算法中的行成本有助于我理解这一点

  14. 14

    Apache Spark-无法理解Scala示例

  15. 15

    Javascript-无法理解这一行代码

  16. 16

    如何做到这一点,以便可以从任何类访问此数组?

  17. 17

    我该如何在访问表格中做到这一点

  18. 18

    两个共享代码的分支-如何在git中做到这一点?

  19. 19

    有人可以解释这一点MVVM代码

  20. 20

    在Scala中将Map [String,String]转换为Map [String,Int]

  21. 21

    在Scala中将Map [String,String]转换为Map [String,Int]

  22. 22

    为什么删除的默认构造函数无法捕捉到这一点?

  23. 23

    Scala:通过Map [String,Any]或更好的替代方法访问/广播条目

  24. 24

    带有嵌套数据结构的Scala访问Map [String,Any]

  25. 25

    scala:为什么代码返回List [Any]而不返回List [String]?

  26. 26

    如何在Scala中从一组String中产生一组Char

  27. 27

    无法将 String[][] 中的元素包含在 Scala 的单个数据结构中

  28. 28

    更优雅的方式做到这一点?

  29. 29

    如何用诺言简化这一点

热门标签

归档