"OR" 操作员必须放在前一行的末尾?(意想不到的托罗普)



我正在运行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解析器在判断表达式何时需要在另一行上继续执行方面做得非常出色。世界上几乎所有其他语言都完全关注这个问题,并需要一个实际的字符来继续到下一行或终止语句。

正如你所知,Ruby的特别之处在于,它几乎总是能解决问题。

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

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

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

但使用换行软终止符代替CCD_ 2。。。下面的语法确实有效:

(p :a
p :b
p :c)

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

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

Ruby将行尾解释为语句的末尾。运算符表示语句的连续性。

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

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

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

最新更新