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

我是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 ,那么使用定义为amount的数字, else生成1到4之间的随机数,然后使用它。

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

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

非常感谢您的阅读!

defined? 是绑定amount ? amount : r(1,4) amount ? amount : r(1,4)所以相当于:

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

你可能想要:

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

实际上,赔率是amount || r(1,4) amount || r(1,4) ,或amount.nil? ? r(1,4) : amount amount.nil? ? r(1,4) : amount amount.nil? ? r(1,4) : amount会更符合你想要的,因为我觉得你不想要这个:

 1.9.3p194:001>定义了吗?(金额)
  =>无 
 1.9.3p194:002>金额=零
  =>无 
 1.9.3p194:003>定义了什么?(金额)
  >>“本地变量” 

…在这种情况下,@ @c将为nil – 已定义变量的值。

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

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

在你的代码中, defined? 方法对amount ? amount : r( 1,4 ) amount ? amount : r( 1,4 )而不仅仅是您想要的amount 。 还有, defined? 运营商可能没有按照您的期望做,看看这篇博客文章就可以了解。

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

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

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

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