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

В различной литературе по 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 будет ссылаться на определенный им объект - и если вы не дадите самому типу внутреннего шаблона то же имя), но, очевидно, не наоборот.

Другие вопросы по тегам