2014-09-24 38 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")