Я могу объединить два списка следующим образом:

List(1,2,3) ::: List(4,5,6)

И результат:

res2: List[Int] = List(1, 2, 3, 4, 5, 6)

Оператор ::: является ассоциативным справа, что это значит?

В математике право ассоциативно это:

5 + ( 5 - ( 2 * 3 ) )
1
zero_coding 5 Апр 2017 в 10:29

2 ответа

Лучший ответ

Правый ассоциативный означает, что оператор (в нашем случае, метод :::) применяется к правому операнду, используя левый операнд в качестве аргумента. Это означает, что фактический вызов метода выполняется следующим образом:

List(4,5,6).:::(List(1,2,3))

Поскольку ::: добавляет список, результатом будет List(1,2,3,4,5,6).

2
Yuval Itzchakov 5 Апр 2017 в 07:31

В самом общем смысле правоассоциативная означает, что если вы не ставите никаких скобок, они будут считаться справа:

a ::: b ::: c == a ::: (b ::: c)

Тогда как левоассоциативные операторы (такие как +) будут иметь

a + b + c == (a + b) + c

Однако согласно спецификации (6.12.3 Операции с инфиксами),

Левоассоциативная двоичная операция e1 op e2 интерпретируется как e1.op(e2). Если оп прямоассоциативен, та же операция интерпретируется как { val x=e1; e2.op(x ) }, где x это новое имя.

Таким образом, правоассоциативные операторы в scala рассматриваются как методы их правого операнда с их левым операндом в качестве параметра (как объяснено в ответе @ Yuval).

1
Cyrille Corpet 5 Апр 2017 в 08:02