用块链接的Ruby方法 - 容易混淆的语法错误

时间:2011-10-14 21:48:43

标签: ruby syntax block method-chaining

所以,我认为我很聪明,我在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方法相同。

我在这里尝试了许多组合 - 带有调用的显式块参数,方法定义中的各种类型的显式优先级。使用lambda而不是块工作得很好,但显然太笨重了,不能用于我的目的。

1 个答案:

答案 0 :(得分:5)

这与您的任何代码无关 - 参数列表中不允许使用and运算符。至于为什么,你必须问核心团队,但IMO最明显的可能性是它的存在理由(具有极低的优先级)在参数列表中不起作用。 / p>