10

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

为什么?!

4

3 回答 3

8

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

一般来说,Ruby 解析器在确定表达式何时需要在另一行继续执行方面做得非常出色。世界上几乎所有其他语言都完全解决了这个问题,并且需要一个实际字符才能继续下一行或终止语句。

如您所知,Ruby 的特别之处在于,几乎总是,它只是计算出来的。

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

例如,您可以编写如下内容:

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

...但是使用换行符软终止符而不是;... 下面的语法确实有效:

(p :a
 p :b
 p :c)

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

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

于 2012-11-21T22:03:14.090 回答
4

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

您也可以使用反斜杠\来表示继续,因此以下内容将起作用

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])
于 2012-11-21T22:02:32.850 回答
2

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

于 2012-11-21T22:03:50.330 回答