2014-09-24 83 views
1

我明白當我嘗試Ruby的三元操作

10 > 5 ? puts "greater" : puts "less" 

我得到一個錯誤,該代碼

options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

轉化爲

if arguments[-1].is_a?(Hash) 
    options = arguments.pop 
else 
    options = {} 
end 

。然而,

puts 10 > 5 ? "greater" : "less" 

返回"greater"這兩個代碼有什麼區別?

+0

在發佈有關您的代碼引發的異常的問題時,請提供完整的錯誤消息,如果不明顯,則提供該錯誤消息。錯誤消息包含有價值的信息你需要仔細研究它們。 – 2014-09-24 22:24:43

回答

4

這是一個語法錯誤和關鍵字/運算符的優先事項。三元運算符的?具有比傳遞給puts參數更高的優先級,因此,紅寶石解析

10 > 5 ? puts "greater" : puts "less" 

作爲

(10 > 5) ? (puts) ("greater") 

這是無效的語法,如:puts後可以預期的。

10 > 5 ? puts("greater") : puts("less") 

將按預期工作。

-1

使用三元運算符,您在第一個例子中首先將您的操作放在options =這是正確的。在你的第二個例子中,檢查後是否puts10 > 5。它基本上只是一個語法錯誤。

2

這只是一個語法錯誤(我的IRB說syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(')。這將如您所期望的那樣工作:

10 > 5 ? (puts "greater") : (puts "less")