7

我对 Ruby 和 Rails 很陌生,但即使在搜索堆栈溢出和谷歌之后,我也找不到答案。

我有一个简单的 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是定义,然后使用定义为 的数字amountelse生成 1 到 4 之间的随机数并改用它。

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

我必须做些什么才能让它按我的预期工作,我做错了什么?

非常感谢您的阅读!

4

3 回答 3

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 > 定义?(数量)
 => 无
1.9.3p194 :002 > 金额 = 无
 => 无
1.9.3p194 :003 > 定义?(数量)
 =>“局部变量”

...在这种情况下@cnil- 定义变量的值。

于 2012-05-06T02:01:20.410 回答
3

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

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

在您的代码中,该defined?方法运行amount ? amount : r( 1,4 )而不是amount按您的预期运行。此外,defined?运营商可能不会按照您的预期行事,请查看此博客条目以了解情况。

于 2012-05-06T02:01:50.820 回答
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/

于 2012-05-06T02:06:57.203 回答