1. ホーム
  2. scala

[解決済み] self型アノテーションにおけるthisとselfの違い?

2022-05-15 19:34:18

質問

Scalaの様々な文献で、自己型アノテーションに"this"を使うものと、"self"を使うものがあるのを見かけますが、どちらがいいのでしょうか?

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

this"と"self"のどちらを使っても、何か違いがあるのでしょうか? どのような名前を使うかは全く問題ではないのでしょうか? これは同じように有効ですか?

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

どのように解決するのですか?

3つの形式はすべて有効で、次のような効果があります。 B の型として仮定されます。 this クラスで A .

最初の2つのバリアントは

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

導入 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 に対する別名を導入するのではなく、単に自己の型を設定するだけです。