2012-06-30 2 views
12

Тип самоуправления выглядит как в следующем примере:В чем причина `=>` в типе self?

trait A { self: String => } 

Это говорит о том, что черта A (или подтип его) должен наследовать класс String.

Ключевое слово self следует за : аналогом переменной в var s: String, где тип приходит после :.

Но что же делает => для самонаведения? В чем причина этого?

+1

Это странный бит синтаксиса, который я думаю, поскольку он кажется стрелкой, которая будет указывать на что-то ... – david

+0

Да, в начале обучения Скала я всегда думал, что стрелка указывает на остальную часть тела , выглядела как функция и меня сбивала с толку. –

ответ

11

Просто угадайте работу ... Вам понадобится определенный разделитель объявления самонаведения. Представьте, что => был просто опущен. this: String будет синтаксически корректным утверждением (хотя средство проверки типа будет жаловаться).

Так какой должен быть разделитель? Вам не нужны вложенные фигурные скобки, такие как trait A { self: String { ... }}. Итак, какие существуют непарные существующие разделители? => - единственный, о котором я могу думать.

Где => Используется в других местах? В качестве сахара для типов функций (A => B) и для функциональных тел (i: Int => i + 1). Также для аргументов по имени, а также для случаев совпадения шаблонов. Это последнее использование несколько согласовано с самонаведением. Это похоже на соответствие this определенного типа, а затем определение тела в зависимости от этого «совпадения». Я не знаю, может быть, это глупая аналогия.

+0

Спасибо, что поделились своими мыслями по этой теме. Звучит неплохо. Я столкнулся с аналогичным направлением. –

9

Отметьте, что self не является ключевым словом, а является нормальным идентификатором. Вы действительно можете написать любой другой действительный идентификатор вместо self. И : после выражения тип опечатки, что-то полностью действительное в любом месте выражения.

=> - это то, что говорит Скале, что существует самонастройка. В противном случае self: Type выглядит как простой оператор, выражение. Например:

class A 
class B extends A { 
    this: A 
} 

Это действительный код Scala, и он не имеет типа self.

+0

Хорошо, спасибо. Есть ли конкретная причина использования символа '=>' в качестве символа для самонаведения или его просто подобрали, потому что он подходит для остального синтаксиса Scalas? –

+0

@JohnThreepwood Odersky не любит зарезервированные символы и ключевые слова, поэтому он пытается повторно использовать те, которые у него есть. Я думаю, что он зашел слишком далеко, когда дело доходит до подчеркивания, но так оно и есть. –

0

this находится в области видимости внутри тела класса, поэтому в этом смысле это параметр (хотя мы никогда не думаем об этом именно так). Синтаксис self-type просто делает его явным и позволяет присвоить ему другое имя (и тип). Таким образом, стрелка становится очень хорошим выбором в качестве разделителя между связующим и его областью.