【问题标题】:Ruby assignment and comparison in one line?一行中的 Ruby 赋值和比较?
【发布时间】:2010-09-30 22:05:39
【问题描述】:

这似乎没有按预期工作:

if c = Countries.first.nil?
  ... do something
end

比较有效,但分配无效。有没有办法在一行中同时进行比较和赋值?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这才是你真正想要的:

    if (c = Countries.first).nil?
      # ... do something
    end
    

    在您的示例中,您将获得c = (Countries.first.nil?),因此c 将是false 或true。

    你实际上可能会这样写:

    unless (c = Countries.first)
      # ... do something
    end
    

    但要小心!我会将() 保留在原位,否则它看起来就像您的意思是比较,并且 ruby​​ 解释器会警告您。

    我有时会使用这种模式,但要谨慎使用它,因为它会使事情变得不那么清晰。

    【讨论】:

    • 为什么不像里德那样呢?我以为他想指定 c = true 或 false(来自.nil?)......但我可能误读了他的问题的意图。
    • @Andrew Reed 的方式是将c 设置为Countries.first.nil?,但他实际上想将c 设置为Countries.first,然后检查if c.nil?
    • 这是一个很好的例子,说明为什么使用括号很重要。
    • 或者一个更好的例子来说明如何将一个语句分成两个不会造成伤害。
    【解决方案2】:

    如果你想将 c 分配给 Country.first 如果 c 为 nil:

    c = Countries.first if c.nil?
    

    【讨论】:

    • 实际上,如果这是你想要的,你可以使用c ||= Countries.first。
    猜你喜欢
    • 2018-07-21
    • 2018-04-01
    • 2018-04-13
    • 2013-02-09
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2012-08-18
    • 2020-03-24
    相关资源
    最近更新 更多