自己型アノテーションにおける this と self の違いは何ですか? 質問する

自己型アノテーションにおける this と self の違いは何ですか? 質問する

さまざまな Scala 文献で、"this" を使用する自己型注釈と "self" を使用する自己型注釈が見られます。

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

「this」と「self」の使用には実際の違いがありますか? 使用する名前は重要ですか? どちらも同じくらい有効ですか?

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

ベストアンサー1

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

最初の2つの変種

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

self(それぞれ、 )をトレイトfooのエイリアスとして導入します。これは、内部クラスから参照にアクセスする場合に便利です。つまり、トレイトの参照にその内部にネストされたクラスからアクセスするときに、代わりに を使用できます。例:thisAthisselfA.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、単に self 型を設定します。

おすすめ記事