Порядок операндов в 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 ответ
Любой оператор с :
с правой стороны его операнды перевернуты. Есть и другие операторы, которые используют это тоже (хотя я не могу думать ни о каких примерах).