0

我最近了解了蛋糕图案以及和的用法之间的区别self =>self:T =>请参阅此处)。这里提到的这些技术细节和真正的 Scala 代码之间的差异继续给我带来问题。例如,请参阅以下来自Inox 项目的代码片段:

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 相关)。我还查看了文件插值器,但似乎没有类型元素。

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

谁能解释一下这里发生了什么?

4

1 回答 1

1
  1. interpolator这是一个类型为 的变量声明Interpolator { val trees: Trees.this.type }。该类型Interpolator { val trees: Trees.this.type }是 的 子类型Interpolator,但通过附加限制进行了改进trees,该限制不仅仅是一些Trees,而是 的一个具体实例Trees,即单例类型之一Trees.this.type。在=typeInterpolator { val trees: Trees.this.type }new { ... } with Interpolator.

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

    trait Foo {
      val trees: Any
    }
    def interpolator: Foo { val trees: Int } = 
      new Foo { val trees = 42 }
    
    interpolator.trees + 58
    
  2. Trees.this.type是value的单例类型this。这种类型只有一个值:Trees.this.

    演示以下用法的较短示例.type

    class Bar
    val b = new Bar
    val c: b.type = b
    
  3. 您将值设置treesTrees.this。您还向编译器保证trees不只是一些Trees,而是单例类型trees的单例值,它是 的严格子类型。Trees.thisTrees.this.typeTrees

于 2018-07-16T15:36:38.493 回答