В чем причина `=>` в типе self?
Тип типа выглядит следующим образом:
trait A { self: String => }
Это говорит о том, что признак A
(или его подтип) должен наследовать класс String
.
Ключевое слово self
сопровождается :
аналогом переменной в var s: String
, где тип появляется после :
.
Но что означает состояние =>
для типа self? В чем причина этого?
Ответы
Ответ 1
Просто угадайте работу... Вам нужен определенный разделитель объявления самонастройки. Представьте, что =>
был просто опущен. this: String
будет синтаксически корректным утверждением (хотя средство проверки типов будет жаловаться).
Итак, какой должен быть разделитель? Вам не нужны вложенные фигурные скобки, например trait A { self: String { ... }}
. Итак, какие существуют непарные существующие разделители? =>
- единственный, о котором я могу думать.
Где =>
используется в другом месте? В качестве сахара для типов функций (A => B
) и для тел функций (i: Int => i + 1
). Также для аргументов по имени, а также для случаев совпадения шаблонов. Это последнее использование несколько согласовано с самонаведением. Это похоже на сопоставление this
определенного типа, а затем определение тела в зависимости от этого "соответствия". Я не знаю, может быть, это глупая аналогия.
Ответ 2
Обратите внимание, что self
не является ключевым словом, а является обычным идентификатором. Вы действительно можете написать любой другой действительный идентификатор вместо self
. И :
после выражения является типом присваивания, что-то полностью действительное в любом случае, когда выражение действительно.
=>
- это то, что говорит Scala, что есть самонастройка. В противном случае self: Type
выглядит как простой оператор, выражение. Например:
class A
class B extends A {
this: A
}
Это допустимый Scala код, и он не имеет типа self.
Ответ 3
this
находится в области видимости внутри тела класса, поэтому в этом смысле это параметр (хотя мы так и не думаем об этом). Синтаксис self-type просто делает его явным и позволяет присвоить ему другое имя (и тип). Таким образом, стрелка становится очень хорошим выбором в качестве разделителя между связующим и его областью.