【问题标题】: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 而不是数字。

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

非常感谢您的阅读!

【问题讨论】:

    标签: ruby expression ternary-operator


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2017-12-24
      • 2016-07-28
      • 1970-01-01
      • 2021-08-01
      • 2019-02-22
      相关资源
      最近更新 更多