Разница между этим и самим собой в аннотациях типа себя?

117

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

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

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

trait A { foo: B => ... }
Теги:

2 ответа

150
Лучший ответ

Все три формы действительны и имеют эффект 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.

  • 0
    То, как я смотрю на тип self, заключается в том, что признак объявил себя как принимающий определенный тип и возвращающий блок кода, например, foo: B => {...}. Теперь эти завитки, конечно, опущены. Интересно видеть, что вы можете использовать имя объекта вместо «this» внутри любой области кода, хотя [то, что мы делаем все время в javascript]
  • 4
    @ Мартин Одерский Можно ли добавить ограничение для двух или более черт, что-то вроде trait A { self: B, C => ... } ?
Показать ещё 1 комментарий
16

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню