Ruby &引用;或;操作员必须放在前一行的末尾?(意外托洛普)

Ruby &引用;或;操作员必须放在前一行的末尾?(意外托洛普),ruby,syntax,syntax-error,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'] ||

我正在运行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'] |...
           ^

为什么

Ruby将行尾解释为语句的结尾。运算符表示语句的继续

您也可以使用反斜杠
\
来表示继续,这样下面的操作就可以了

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])
我能说的是“这就是它的工作原理”

一般来说,Ruby解析器在计算表达式何时需要在另一行上继续时做了一项惊人的工作。世界上几乎所有其他语言都在这个问题上下赌注,并且需要一个实际的字符来继续下一行或终止语句

正如你所知道的,Ruby在这方面很特别,几乎总是它能找到答案

不过,在这种情况下,存在冲突。解析器知道表达式尚未完成,因为它仍在查找
,但它可能是一个复合表达式

例如,您可以这样写:

(p :a; p :b; p :c)
…但使用换行符软终止符而不是
。。。下面的语法确实有效:

(p :a
 p :b
 p :c)
(顺便说一句,该表达式的值是序列中最后一个表达式的值。)


如果没有更好的提示(例如二进制运算符,显然需要另一行),Ruby无法同时解析您的语句和上面的语句。

由于Ruby是面向行的,因此以运算符结尾的语句被解释为不完整的。在运算符后添加反斜杠将允许正确解释多行语句。(来源:)

我不确定“惊人的工作”是否正确(我认为这很奇怪,因为表达式可以由一个操作符在下面的一行上继续),但Ruby语言(warts and all)是如何定义的,所以+1。(JavaScript处理这一点的方式不同——可能更“预期”——ASI有一些受限的产品。)事实上:Scala和Python——也不需要分号——处理这一点的方式也不同,与Ruby相比,可能更“预期”。但是,他们不支持后一种形式(带有括号,没有语句分隔符),这是一种奇怪的结构)。