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

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 之间的随机数。

我打算这样做的方式是定义ifamount,然后使用定义为amountelse 的数字生成一个介于 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 可能更符合您的要求,因为我认为您不希望这样:

1.9.3p194 :001 > 定义?(数量) => 无 1.9.3p194 :002 > 金额 = 无 => 无 1.9.3p194 :003 > 定义?(数量) =>“局部变量”

...在这种情况下,@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/

【讨论】:

以上是关于带有“已定义?”的三元表达式返回“表达式”而不是值?的主要内容,如果未能解决你的问题,请参考以下文章

三元表达式 ,迭代器, 生成器,二分法

三元表达式,递归,

三元表达式

三元表达式与列表推导式

三元操作符

Python-yield 三元运算 Lambda表达式