我最近了解了蛋糕图案以及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
...
}
总而言之,整个代码段对我来说意义不大(这是代码中经常重复的模式),让我解释一下:
val interpolator: Interpolator { ... }
到目前为止,我写了val name: Type = value
,这里没有平等之处。
Trees.this.type
应该是一种类型,但是什么类型?它应该在Trees trait中定义,我敢打赌的this
上下文不同于trait Trees
上下文(与问题1有关)。我还查看了文件Interpolators,但似乎没有类型元素。
最大的一行是protected val trees: Trees.this.type = Trees.this
。
有人可以解释一下这里发生了什么吗?
答案 0 :(得分: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
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
您正在将值class Bar
val b = new Bar
val c: b.type = b
设置为trees
。您还向编译器保证Trees.this
不仅是trees
的一部分,而且Trees
是单例类型trees
的单例值Trees.this
,即Trees.this.type
的严格子类型。