红宝石中运算符的优先级

时间:2014-02-06 13:43:01

标签: ruby expression

我在ruby中试过这样的代码:

if object && object.is? ball
   object.throw!
end

这导致语法错误:

 unexpected tIDENTIFIER, expecting keyword_then or ';' or '\n'

我认为这是因为&&必须具有比函数调用更高的“优先级”(对不起,我不知道正确的术语)所以Ruby基本上将语句视为:

if (object && object.is?) ball
   object.throw!
end

这没有意义,所以语法错误是有序的。

这一点得到了以下事实的支持:

if object and object.is? ball
   object.throw!
end

我认为这是因为'and'运算符的优先级低于&&,所以函数调用的“优先级”必须介于&&和'和'。

但是,在我之前看到的优先顺序表中,未列出函数调用。

我希望能够深入了解这里发生的事情,也许还有一些对ruby规范的引用。我不是表达式解析的专家,我只是想更多地了解这个例子背后的过程,问题和理论,毫无疑问,这是一个更广泛的话题

1 个答案:

答案 0 :(得分:0)

由于运营商优先权,您应该:

if object && (object.is? ball)

if object && object.is?(ball)

原因是“&&”和“||”优先级高于“和”和“或”。因此,如果你不使用括号“object.is?ball”,“object.is?”将首先被“&&”抓住。但是,如果使用“和”而没有括号,它可以正常工作,因为它在这种情况下具有最低优先级:

if object and object.is? ball