2011-09-06 81 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