2016-10-09 4 views
0

Я понимаю, что результат такого типа само как вПочему я вместо этого сам по себе?

trait SpellChecker { 
    self: RandomAccessSeq[char] => 
    ... 
} 

из http://www.markthomas.info/blog/92

, но я не понимаю, почему это лучше использовать self вместо this здесь ...!? Кроме того, если я пишу asfd вместо self Я также не получаю ошибку компилятора ... поэтому я не совсем уверен, что «я» - это все. Я не вижу, что возможно использовать self как объект в одном из методов этого свойства позже.

ответ

3

self - это псевдоним для экземпляра SpellChecker. Это полезно, если у вас есть вложенные структуры (например, классы). Рассмотрим это:

trait Foo { 
    self => 

    override def toString : String = "Foo here" 

    class Bar { 
    def print() : Unit = { 
     println(s"this = $this") 
     println(s"self = $self") 
    } 
    override def toString : String = "Bar here" 
    } 
} 

val foo = new Foo {} 
val bar = new foo.Bar() 
bar.print() 

Выходы:

this = Bar here 
self = Foo here 

Так что, если вы хотите, чтобы ссылаться на внешний элемент, который вы можете использовать свой псевдоним. Использование this означает отсутствие псевдонимов, поэтому this : Example => означает «Мне не нужен псевдоним для этого, я просто хочу убедиться, что это смешано с примером». И вы можете назвать свой псевдоним, но, как вам нравится, asfd не более iLikeFries. self - только несколько соглашение.

+0

Итак, я на самом деле смешиваю две вещи: саморегулярный псевдоним «я» и рецепт наследования? В вашем примере вы не дали рецепт наследования, не так ли? Вы просто написали «это», верно? – Make42

+0

Исправить. Это не так много, вы смешиваете вещи, но это две вещи, которые вы можете сделать с аннотацией самостоятельного типа: 1) Создайте псевдоним для 'this' и 2). Убедитесь, что признак используется только в сочетании с некоторым требуемым типом (s). Вы можете сделать одно, другое или оба. Ваш вопрос был в первую очередь сформулирован о части псевдонима. – alextsc

1

В данном конкретном случае нет смысла переименовывать this. Это имеет смысл в случае вложенности при переименовании внешнего this и доступа к нему во вложенном шаблоне/объекте.

Смежные вопросы