带有“已定义?”的三元表达式返回“表达式”而不是值?
Posted
技术标签:
【中文标题】带有“已定义?”的三元表达式返回“表达式”而不是值?【英文标题】:Ternary expression with "defined?" returns "expression" instead of value? 【发布时间】:2012-05-15 02:26:15 【问题描述】:我对 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
而不是数字。
我必须做些什么才能让它按预期工作,我做错了什么?
非常感谢您的阅读!
【问题讨论】:
【参考方案1】: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
可能更符合您的要求,因为我认为您不希望这样:
...在这种情况下,@c
将是 nil
- 已定义变量的值。
【讨论】:
完美,非常感谢!显然我还没有学习更多这些基础知识,但这对我很有帮助amount || r(x,y)
完全按照我的意愿工作,并且同时使用更少的字符。【参考方案2】:
在这种情况下使用||
运算符:
@c = amount || r (1,4)
在您的代码中,defined?
方法在 amount ? amount : r( 1,4 )
上运行,而不是像您预期的那样仅在 amount
上运行。此外,defined?
操作符可能没有达到您的预期,请查看此blog entry 以获得一个想法。
【讨论】:
谢谢!那篇博文很有启发性,现在我知道defined?
真正有用的是什么!【参考方案3】:
您正在寻找空合并运算符。试试这个:
@c = amount || r(1,4)
如果定义了数量,此代码会将数量分配给@c。如果不是,它会将 r(1,4) 的结果分配给@c。
http://eddiema.ca/2010/07/07/the-null-coalescing-operator-c-ruby-js-python/
【讨论】:
以上是关于带有“已定义?”的三元表达式返回“表达式”而不是值?的主要内容,如果未能解决你的问题,请参考以下文章