“OR”运算符必须放在前一行的末尾? (意外的tOROP)

时间:2012-11-21 21:49:41

标签: ruby syntax syntax-error

我正在运行Ruby 1.9。

这是一种有效的语法:

items = (data['DELETE'] || data['delete'] ||
         data['GET'] || data['get'] || data['POST'] || data['post'])

但这给了我一个错误:

items = (data['DELETE'] || data['delete']
         || data['GET'] || data['get'] || data['POST'] || data['post'])

t.rb:8: syntax error, unexpected tOROP, expecting ')'
         || data['GET'] || data['get'] |...
           ^

为什么?!

3 个答案:

答案 0 :(得分:8)

我能说的是“这就是它的工作原理”。

一般来说,Ruby解析器可以很好地确定表达式何时需要在另一条线上继续运行。世界上几乎所有其他语言都完全解决了这个问题,需要一个实际的角色继续下一行或终止声明。

如你所知,Ruby非常特别,几乎总是如此,它只是想出来。

但在这种情况下,存在冲突。解析器知道你的表达式没有完成,因为它仍然在寻找),但它可能是一个复合表达式。

例如,你可能会写这样的东西:

(p :a; p :b; p :c)

...但是使用换行软终止符而不是; ...下面这个语法实际上有效:

(p :a
 p :b
 p :c)

(顺便说一下,该表达式的值是序列中最后一个表达式的值。)

Ruby没有更好的提示解析你的语句和上面的语句,例如显然需要另一行的二元运算符。

答案 1 :(得分:4)

Ruby将行尾作为语句的结尾解释。运营商表示继续发表声明。

您可以使用反斜杠\来表示延续,以便以下工作

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])

答案 2 :(得分:2)

由于ruby是面向行的,因此以运算符结尾的语句被解释为不完整。在运算符后添加反斜杠将允许正确解释多行语句。 (来源:http://phrogz.net/ProgrammingRuby/language.html