2011-09-06 71 views
2
if !row[0].include? 'Changed database' || !row[0].starts_with? '---' || !row[0].include? "rows affected" || !row[0].nil? || !row[0] == "" 

,如果我做为什么我不能用红宝石做这个?

if !row[0].include? 'Changed database' 

它工作得很好,但如果我做多的条件,那么这个错误

SyntaxError: /Users/tamer/Sites/active/app/models/account.rb:42: syntax error, unexpected tSTRING_BEG, expecting kTHEN or ':' or '\n' or ';' 
...ase' || !row[0].starts_with? '---' || !row[0].include? "rows... 

回答

7

失败有时分析器无法自己是如何分组猜想参数。

在您的例子,它解释'Changed database' || !row[0].starts_with?作为参数传递给include?,当它遇到的下一个标记,'---',然后是没有意义的窒息。

加括号清理的模糊性就能解决问题,如:

if !row[0].include?('Changed database') || !row[0].starts_with?('---') || !row[0].include?("rows affected") || !row[0].nil? || !row[0] == "" 

如果你真的,真的很讨厌括号,你也可以切换到使用or代替||,其中有一个较弱的优先级,将在稍后应用,例如:

if !row[0].include? 'Changed database' or !row[0].starts_with? '---' or !row[0].include? "rows affected" or !row[0].nil? or !row[0] == "" 
+0

一个大的'(围绕所有事物)'也可以。 – 2011-09-06 21:23:05

+1

或者使用'或'代替'||',它的优先级较低。 – RocketR

+0

这就是为什么Ruby中的“可选”括号不是如此可选的原因。人们必须承认,编写不含括号的DSL似乎很好,但否则它不是一个好主意。 – tokland