Подтвердить что ты не робот

В чем причина `=>` в типе self?

Тип типа выглядит следующим образом:

trait A { self: String => }

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

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

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

4b9b3361

Ответ 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 просто делает его явным и позволяет присвоить ему другое имя (и тип). Таким образом, стрелка становится очень хорошим выбором в качестве разделителя между связующим и его областью.