Итак, думая, что я умный, я добавляю такой метод к 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.
Я попробовал несколько комбинаций здесь - явные параметры блока с вызовами, различные типы явного приоритета внутри определения метода. Использование лямбды вместо блока работало нормально, но, очевидно, слишком неуклюже, чтобы использовать его в моих целях.