三元表达与“定义?”返回“表达式”而不是值?

时间:2012-05-06 01:57:58

标签: ruby expression ternary-operator

我对Ruby和Rails很陌生,但即使在搜索了堆栈溢出和google之后我也无法找到答案。

我有一个简单的Ruby简写if语句应该像这样返回integer

# in the context of this erb document `amount` is defined as 5.
@c = ( defined? amount ? amount : r( 1,4 ) )

r()是一个自定义帮助函数,它在之间返回一个随机数,在这种情况下 1和4。

我打算这样做的方式是定义if amount,然后使用定义为amount的数字,else生成1到4之间的随机数而是使用它。

打印出@c时,Ruby会输出expression而不是数字。

我需要做些什么才能让我按照我的意图工作,我做错了什么?

非常感谢您的阅读!

3 个答案:

答案 0 :(得分:9)

defined?绑定到amount ? amount : r(1,4),因此它等同于:

defined?(amount ? amount : r(1,4))

你可能想要:

defined?(amount) ? amount : r(1,4)

实际上,可能性amount || r(1,4)amount.nil? ? r(1,4) : amount会更符合您的要求,因为我认为您不希望这样:

1.9.3p194 :001 > defined?(amount)
 => nil 
1.9.3p194 :002 > amount = nil
 => nil 
1.9.3p194 :003 > defined?(amount)
 => "local-variable" 

...在这种情况下@c将是nil - 定义变量的值。

答案 1 :(得分:3)

在这种情况下使用||运算符:

@c = amount || r (1,4)

在您的代码中,defined?方法在amount ? amount : r( 1,4 )上运行,而不是按照您的意图在amount上运行。此外,defined?运算符可能无法达到预期效果,请查看此blog entry以获取主意。

答案 2 :(得分:2)

您正在寻找空合并运算符。试试这个:

@c = amount || r(1,4)

如果定义了金额,此代码将为@c分配金额。如果不是,它会将r(1,4)的结果分配给@c。

http://eddiema.ca/2010/07/07/the-null-coalescing-operator-c-ruby-js-python/