Метод Ruby, соединенный с блоками - ошибочно синтаксическая ошибка - PullRequest
1 голос
/ 15 октября 2011

Итак, думая, что я умный, я добавляю такой метод к 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.

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

1 Ответ

5 голосов
/ 15 октября 2011

Это никак не связано с вашим кодом - оператор and просто не разрешен в списке аргументов. Что касается , почему , вам нужно спросить команду Core, но наиболее очевидная возможность IMO состоит в том, что ее смысл (имеющий крайне низкий приоритет) не работает в списке аргументов.

...