Порядок операндов в Scala List.prepend (::)

Одерски имеет блестяще оптимизированный синтаксис Java, позволяющий вызывать объекты без точек и скобок. Т.е. вместо list.prepend(item)-А ты сейчас просто пишешь list :: item, что также превращает языковые операторы в простые методы объекта. Здесь список определяет :: (prepend) оператор. Тем не менее, вы обычно пишете это наоборот в Scala, используя item :: list, Это предполагает, что каждый (листируемый) тип определяет ::(List) оператор, который невероятно. Как осуществляется обращение операнда? Я не могу понять это из исходного кода

class List[+A] extends AbstractSeq[A]
  def ::[B >: A] (x: B): List[B] =
    new scala.collection.immutable.::(x, this)

Кажется, что::(val head, val tail) также обозначает имя типа. Но это не подходит head :: tail шаблон в любом случае.

1 ответ

Решение

Любой оператор с : с правой стороны его операнды перевернуты. Есть и другие операторы, которые используют это тоже (хотя я не могу думать ни о каких примерах).

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