小编nev*_*era的帖子

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

所以,我认为我很聪明,我添加这样的方法Object:

class Object
  def apply_if(cond)
    if cond
      yield self
    else
      return self
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这(我认为)允许我有条件地向方法链添加位,这简化了我的ActiveRecord查询操作.但它给出了语法错误,我可以将其简化为以下代码:

data = [1,2,3,4,5]
results = data.
  apply_if(true and false) do |q|
    q + [0,0]
  end
Run Code Online (Sandbox Code Playgroud)

同样这个错误:

results = data.apply_if(true and false){|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)

但这有效:

results = data.apply_if ((true and false)) {|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)

同样如下:

results = data.apply_if (true && false) {|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)

我看到这些差异都与运算符优先级有关,但是如何在一对括号内的运算符的优先级重要?

为什么这里会出现语法错误?我没有看到任何可能的语法歧义,并且这种方法在形状上与Array#reduce方法相同.

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

ruby syntax block method-chaining

1
推荐指数
1
解决办法
618
查看次数

标签 统计

block ×1

method-chaining ×1

ruby ×1

syntax ×1