Ruby, define [] = operator, почему нельзя управлять возвращаемым значением?

Пытаясь сделать что-то странное, что может превратиться во что-то более полезное, я попытался определить свой собственный оператор []= в пользовательском классе, который вы можете сделать, и вернуть ему что-то отличное от аргумента value, которое видимо, вы не можете этого сделать. []= Возвращаемое значение оператора всегда value; даже если вы переопределите этот оператор, вы не сможете контролировать возвращаемое значение.

class Weird 
  def []=(key, value)
    puts "#{key}:#{value}"
    return 42
  end
end

x = Weird.new
x[:a] = "a"
  output "a:a"
  return value => "a"  # why not 42?

Есть ли у кого-нибудь объяснения? В любом случае?

рубиновая МРТ 1.8.7. Это одно и то же во всех рубинах; Является ли это частью языка?

Ответ 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. Это верно, даже если назначение относится к методу атрибута, который возвращает что-то другое.

Ответ 2

Его оператор присваивания, и они всегда оценивают назначенное значение. Сделать это было бы странно.

Я предполагаю, что вы можете использовать x.[]= :a, "a" для получения возвращаемого значения.