自己型注釈におけるこれと自己の違いは?


134

Scalaのさまざまな文献で、「this」を使用した自己型注釈と「self」を使用した注釈がいくつかあります。

trait A { this: B => ... }
trait A { self: B => ... }

「これ」と「自分」の違いはありますか?どのような名前を使用するかはまったく重要ですか?これは同じように有効ですか?

trait A { foo: B => ... }

回答:


181

3つの形式はすべて有効であり、classのB型として想定される効果があります。thisA

最初の2つのバリアント

trait A { self: B => ... }
trait A { foo: B => ... }

in traitのエイリアスとしてself(それぞれfoo)を導入thisしますA。これはthis、内部クラスから参照にアクセスするのに役立ちます。つまり、その中にネストされたクラスから特性の参照にアクセスするときのself代わりに使用できます。例:A.thisthisA

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。自己タイプを設定するだけです。


自己型の見方は、トレイトが特定の型を取り、コードブロックを返すように宣言されていることです(例:foo:B => {...})。現在、これらの巻き毛はもちろん省略されています。コードのどのスコープ内でも「this」の代わりにオブジェクト名を使用できることは興味深いですが、[JavaScriptで常に行うこと]
Ustaman Sangat

4
@Martin Odersky 2つ以上の特性に制限を追加することは可能trait A { self: B, C => ... }ですか?
ドミトリーベスパロフ2014年

13
@DmitryBespalov:はい、with自己入力注釈でキーワードを使用できます。例えばtrait A { self: B with C => ... }
デイブ

ところで_: B =>、簡単にするために、エイリアス以外のケースでも実行できます
Creos

17

this常に最も内側のテンプレートで定義されたオブジェクトを参照するという点で違いがあります。

thisは、テンプレートまたは複合タイプのステートメント部分に表示できます。これは、参照を囲む最も内側のテンプレートまたは複合タイプによって定義されるオブジェクトを表します。これが複合タイプの場合、タイプthisはその複合タイプです。単純な名前がCのクラスまたはオブジェクト定義のテンプレートの場合、これのタイプはCのタイプと同じです。this。(Scala Ref。§6.5)

したがって、自分のセルフタイプを呼び出す場合fooでも、それを参照できますthis(もちろん、内部テンプレートを使用している場合thisは、そのテンプレートで定義されたオブジェクトを参照しますが、内部テンプレートを指定しない限り、テンプレートは同じ名前を自己入力します)が、明らかに逆ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.