回答:
3つの形式はすべて有効であり、classのB
型として想定される効果があります。this
A
最初の2つのバリアント
trait A { self: B => ... }
trait A { foo: B => ... }
in traitのエイリアスとしてself
(それぞれfoo
)を導入this
しますA
。これはthis
、内部クラスから参照にアクセスするのに役立ちます。つまり、その中にネストされたクラスから特性の参照にアクセスするときのself
代わりに使用できます。例:A.this
this
A
class MyFrame extends JFrame { frame =>
getContentPane().add( new JButton( "Hide" ) {
addActionListener( new ActionListener {
def actionPerformed( e: ActionEvent ) {
// this.setVisible( false ) --> shadowed by JButton!
frame.setVisible( false )
}
})
})
}
3番目のバリアント、
trait A { this: B => ... }
のエイリアスは導入されていませんthis
。自己タイプを設定するだけです。
trait A { self: B, C => ... }
ですか?
with
自己入力注釈でキーワードを使用できます。例えばtrait A { self: B with C => ... }
_: B =>
、簡単にするために、エイリアス以外のケースでも実行できます
this
常に最も内側のテンプレートで定義されたオブジェクトを参照するという点で違いがあります。
式
this
は、テンプレートまたは複合タイプのステートメント部分に表示できます。これは、参照を囲む最も内側のテンプレートまたは複合タイプによって定義されるオブジェクトを表します。これが複合タイプの場合、タイプthis
はその複合タイプです。単純な名前がCのクラスまたはオブジェクト定義のテンプレートの場合、これのタイプはCのタイプと同じです。this
。(Scala Ref。§6.5)
したがって、自分のセルフタイプを呼び出す場合foo
でも、それを参照できますthis
(もちろん、内部テンプレートを使用している場合this
は、そのテンプレートで定義されたオブジェクトを参照しますが、内部テンプレートを指定しない限り、テンプレートは同じ名前を自己入力します)が、明らかに逆ではありません。