Ответ 1
Обратите внимание, что это поведение также относится ко всем выражениям присваивания (т.е. также методы назначения атрибутов: def a=(value); 42; end
).
Я предполагаю, что он разработан таким образом, чтобы упростить точное понимание выражений присваивания, используемых в качестве частей других выражений.
Например, разумно ожидать, что x = y.a = z[4] = 2
:
- вызов
z.[]=(4,2)
, затем - вызов
y.a=(2)
, затем - присвойте
2
локальной переменнойx
, а затем, наконец, - введите значение
2
в любое выражение "окружающего" (или более низкого приоритета).
Это следует за принципом наименьшего удивления; было бы удивительно, если бы вместо этого он был эквивалентен x = y.a=(z.[]=(4,2))
(при этом на конечном значении влияли оба вызова метода).
Хотя это не совсем авторитетно, вот что должно сказать программирование Ruby:
-
Программирование Ruby (1.8), в Expressions:
Оператор присваивания устанавливает переменную или атрибут с левой стороны (lvalue), чтобы ссылаться на значение справа (значение r). Затем он возвращает это значение в результате выражения присваивания.
-
Программирование Ruby 1.9 (3-е изд.) в разделе 22.6 Выражения, условные обозначения и циклы:
(сразу после описания вызовов метода
[]=
)Значение выражения присваивания - его значение r. Это верно, даже если назначение относится к методу атрибута, который возвращает что-то другое.