2010-09-15 81 views
2

這是一個意外的查找。一個非常基本的Ruby的問題,我不碰巧碰上之前的事情:如果語句中出現oneliner語句會產生錯誤,則Ruby會生成錯誤

a = "a" 

if a 
    test = "yes" if a == "a" else "no" 
else 
    test = "no" 
end 

運行這會產生錯誤:

syntax error, unexpected kELSE, expecting kEND 

貌似嵌套oneliner流溢到封閉的if語句。什麼是這個一般化的解決方案?在爆炸的if語句中不使用oneliner? (它在爆炸附帶條件時起作用,因爲它是由關鍵字end終止的。

順便說一句,這是一個最小化的人爲的例子,所以不需要解釋它的愚蠢或問題爲什麼我會這麼做。對於

+0

「是「如果a ==」a「else」no「看起來像Python條件表達式,但絕對不是Ruby。 – tokland 2010-09-15 19:21:39

+0

呃,哎呀。我已經是Pythonista超過15年了。我認爲當我輸入的速度很快時,即使在輸入Ruby時,它也會出來Python: – JohnMetta 2010-09-17 03:34:10

回答

6

如果你想放if else成一條線,使用then這樣的:

if a then b else c end 

,如果你願意,你可以使用;代替then,像這樣:

if a ; b else c end 

此外,有時你可以用它來代替?:

a && b || c 
2
test = "yes" if a == "a" else "no" 

如何防止紅寶石oneliner if語句蔓延到封閉條件範圍的一般說明。沒有工作,因爲語言不允許它,嘗試

test = a == "a" ? "yes" : "no" 
0

的原因錯誤是你在這一行用「如果修改」:

test = "yes" if a == "a" else "no" 

如果改性劑只接受一個條件 - 因此syntax error, unexpected kELSE, expecting kEND

正如其他人提及的,三元運營商非常適合這些單行。

+0

我懷疑語法錯誤來自外部'if'在一行中看到兩個'else'。 – 2010-09-15 19:47:14

+0

可能,但是如果你終止內部的話,你會得到同樣的錯誤。 – Brian 2010-09-15 20:07:31

0

而不是在複製你都在外ifelse塊「否」的答案,我已經重寫了整個事情:

a = "a" 
test = if a && a == "a" 
     "yes" 
     else 
     "no" 
     end 

或者作爲一個班輪:

a = "a" 
test = (a && a == "a") ? "yes" : "no"