Разница между этим и самим собой в аннотациях типа себя?
В различной литературе по Scala я вижу некоторые аннотации самопечатания, использующие "this", а другие - "self":
trait A { this: B => ... }
trait A { self: B => ... }
Есть ли реальная разница между использованием этого или себя? Имеет ли значение какое имя вы используете? Это так же верно?
trait A { foo: B => ... }
2 ответа
Все три формы действительны и имеют эффект 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
; он просто устанавливает сам тип.
В этом есть разница this
всегда относится к объекту, определенному самым внутренним шаблоном.
Выражение
this
может появиться в части утверждения шаблона или составного типа. Он обозначает объект, определяемый самым внутренним шаблоном или составным типом, включающим ссылку. Если это составной тип, типthis
это составной тип. Если это шаблон определения класса или объекта с простым именем C, его тип совпадает с типом C.this
, (Ref. §6.5 Scala)
Итак, если вы называете свой тип foo
, вы все еще можете сослаться на это как this
(если, конечно, вы не во внутреннем шаблоне, в этом случае this
будет ссылаться на определенный им объект - и если вы не дадите самому типу внутреннего шаблона то же имя), но, очевидно, не наоборот.