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

ako*_*nsu 10 ruby syntax syntax-error

我正在运行Ruby 1.9.

这是一个有效的语法:

items = (data['DELETE'] || data['delete'] ||
         data['GET'] || data['get'] || data['POST'] || data['post'])
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

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'] |...
           ^
Run Code Online (Sandbox Code Playgroud)

为什么?!

Dig*_*oss 8

我能说的是"这就是它的运作方式".

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

如你所知,Ruby非常特别,几乎总是如此,它只是弄明白了.

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

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

(p :a; p :b; p :c)
Run Code Online (Sandbox Code Playgroud)

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

(p :a
 p :b
 p :c)
Run Code Online (Sandbox Code Playgroud)

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

如果没有更好的提示,Ruby无法解析您的语句和上述语句,例如显然需要另一行的二元运算符.