所以我创建了一个按预期失败的示例:
scala> trait A { val v = "a" }
defined trait A
scala> trait B { this :A => ; var v = "" ; this.v = "b" }
<console>:6: error: reassignment to val
trait B { this :A => ; var v = "" ; this.v = "b" }
^
自我类型的“this”遮蔽了 B 的“this”——看起来很奇怪,但很有意义。
那么,给自我类型起一个不同的名字似乎是明智的。我这样做了,很惊讶:
scala> trait C { a :A => ; var v = "" ; this.v = "c" }
<console>:6: error: reassignment to val
trait C { a :A => ; var v = "" ; this.v = "c" }
^
还是有阴影???
更改“本地”变量的名称可以编译,这是有道理的:
scala> trait D { a :A => ; var w = "" ; this.w = a.v }
defined trait D
(并且可以选择使用 self 类型名称来明确使用哪个“v”。)
好的。这意味着以下应该失败?
scala> trait E { this :A => ; var w = "" ; this.w = this.v }
defined trait E
嗯?这是哪个?:-(
那么......命名自我类型有什么意义吗?无论如何,“这个”似乎最终都被遮蔽了。
或者这是范围规则的边缘情况,其中自我类型的“this”优先于特征的“this”——并且应该避免对相关特征中的事物使用相同的名称?