我正在运行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'] |...
^
为什么?!
答案 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)