Итак, думая, что я умный, я добавляю такой метод к Object
:
class Object
def apply_if(cond)
if cond
yield self
else
return self
end
end
end
Это (я думал) позволяет мне условно добавлять биты в цепочку методов, что немного упрощает манипуляции с запросами ActiveRecord. Но это дает синтаксическую ошибку, которую я могу сократить до следующего кода:
data = [1,2,3,4,5]
results = data.
apply_if(true and false) do |q|
q + [0,0]
end
Точно так же эти ошибки:
results = data.apply_if(true and false){|q| q + [0,0]}
Но это работает:
results = data.apply_if ((true and false)) {|q| q + [0,0]}
Как делает:
results = data.apply_if (true && false) {|q| q + [0,0]}
Я вижу, что все различия связаны с приоритетом оператора, но какое значение может иметь приоритет оператора внутри пары круглых скобок?
Почему здесь вообще синтаксическая ошибка? Я не вижу вероятных синтаксических двусмысленностей, и этот метод идентичен по форме методу Array#reduce.
Здесь я пробовал несколько комбинаций — явные параметры блока с вызовами, различные типы явного приоритета внутри определения метода. Использование лямбды вместо блока работало нормально, но явно слишком неуклюже для моих целей.