これらの 投稿に取り組んでいると、少なくともある程度は自己タイプを理解していると思いました。
そこで、期待どおりに失敗した例を作成しました。
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" }
^
自己型の「これ」は、B の「これ」の影になっています。奇妙に見えますが、理にかなっています。
その場合、自己型に別の名前を付けるのが賢明に思えます。私はこれを行い、かなり驚いた:
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
(また、自己型名は、使用する「v」を明確にするためにオプションで使用できます。)
わかった。これは、以下が失敗することを意味しますか?
scala> trait E { this :A => ; var w = "" ; this.w = this.v }
defined trait E
は?これはどっち?:-(
それで... 自己型に名前を付ける意味はありますか? 「これ」は関係なく影になってしまうようです。
それとも、自己型の「this」が特性の「this」よりも優先されるスコープ規則のエッジケースですか?関連する特性に同じ名前を使用することは避けるべきですか?