Разница между этим и "я" в аннотациях самостоятельного типа?

В различных публикациях Scala я вижу некоторые аннотации для самостоятельного типа, используя "this", а другие используют "self": ​​

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

Есть ли какая-либо реальная разница между использованием "this" или "self"? Неважно, какое имя вы используете? Насколько это справедливо?

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

Ответы

Ответ 1

Все три формы действительны и имеют эффект B как тип this в классе A.

Первые два варианта

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 )
      }
    })
  })
}

Третий вариант,

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

не вводит псевдоним для this; он просто устанавливает тип self.

Ответ 2

Существует разница в том, что this всегда ссылается на объект, определяемый самым внутренним шаблоном.

Выражение this может отображаться в части утверждения шаблона или составного типа. Это означает, что объект определяется самым внутренним шаблоном или составным типом, охватывающим ссылку. Если это сложный тип, тип this является составным типом. Если это шаблон определения класса или объекта с простым именем C, тип этого типа совпадает с типом C. this. (Scala §6.5)

Итак, если вы вызываете свой тип foo, вы все равно можете ссылаться на него как this (если, конечно, вы не находитесь во внутреннем шаблоне, и в этом случае this будет ссылаться на определенный объект им - и если вы не дадите внутренним шаблонам самоназвание одно и то же имя), но, очевидно, не наоборот.