自我了解真正的蛋糕图案代码,并参考

时间:2018-07-16 15:15:43

标签: scala types cake-pattern singleton-type refinement-type

我最近了解了蛋糕图案以及self =>self:T =>的用法之间的区别(请参阅here)。这些技术和实际的Scala代码(remarked here)之间的差异继续给我带来麻烦。例如,请参见以下摘自Inox project的代码段:

trait Trees
  extends Expressions
     with Constructors
     with Extractors
     with Types
     with Definitions
     with Printers
     with TreeOps { self =>

     ...

     val interpolator: Interpolator { val trees: Trees.this.type } = new {
      protected val trees: Trees.this.type = Trees.this
     } with Interpolator    

     ...
}

总而言之,整个代码段对我来说意义不大(这是代码中经常重复的模式),让我解释一下:

  1. 这是什么语法?

val interpolator: Interpolator { ... }

到目前为止,我写了val name: Type = value,这里没有平等之处。

  1. Trees.this.type应该是一种类型,但是什么类型?它应该在Trees trait中定义,我敢打赌的this上下文不同于trait Trees上下文(与问题1有关)。我还查看了文件Interpolators,但似乎没有类型元素。

  2. 最大的一行是protected val trees: Trees.this.type = Trees.this

有人可以解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

  1. 这是类型为interpolator的变量Interpolator { val trees: Trees.this.type }的声明。类型Interpolator { val trees: Trees.this.type }Interpolator的子类型,但refined的附加限制是trees不仅是某些Trees,而是{的一个具体实例{1}},即单例类型Trees之一。在类型Trees.this.type=之间有一个等号Interpolator { val trees: Trees.this.type }

    更短的示例单独演示了语法:

    new { ... } with Interpolator
  2. trait Foo { val trees: Any } def interpolator: Foo { val trees: Int } = new Foo { val trees = 42 } interpolator.trees + 58 是值Trees.this.type的{​​{3}}。此类型只有一个值:this

    更简短的示例,演示了Trees.this的用法:

    .type
  3. 您正在将值class Bar val b = new Bar val c: b.type = b 设置为trees。您还向编译器保证Trees.this不仅是trees的一部分,而且Trees是单例类型trees的单例值Trees.this,即Trees.this.type的严格子类型。