【问题标题】:How do you set a boolean default value in Ruby?如何在 Ruby 中设置布尔默认值?
【发布时间】:2012-11-09 04:59:11
【问题描述】:

对于其他类型的变量,我使用||=,但这不适用于布尔值(x ||= true 将 x 分配为 true,即使 x 之前已分配为 false)。

我认为这会起作用:

x = true unless defined?(x)

但它没有:它出于某种原因将 x 分配给 nil。 (这里的解释将不胜感激。)

我确实知道一种有效的方法:

unless defined?(x)
  x = true
end

但它相当冗长。有没有更简洁的方法来为 Ruby 中的布尔变量分配默认值?

【问题讨论】:

  • 您是否有理由不希望将 x 分配给 nil(在所有意图和目的上都等同于 false)?
  • @sylvain.joyeux 因为他希望它是true,而不是虚假的。
  • @sylvain.joyeux 使用 nil 代替 false 很好,但它不能解决 ||= 的问题。如果您尝试使用 ||= 为 x 分配默认值,并且 x 之前已分配给 nil,它将被覆盖而不是保留 nil 的值(因为 nil 是假的)。

标签: ruby


【解决方案1】:

您必须先拥有defined?,否则解析器会到达x =,然后在运行unless 之前定义x(使其成为nil):

defined?(x) or x = true
x  #=> true
x = false
defined?(x) or x = true
x  #=> false

执行if/unless 块(而不是后if/unless 单行)也可以:

unless defined?(x)
  x = true
end
x  #=> true
x = false
unless defined?(x)
  x = true
end
x  #=> false

【讨论】:

  • 你用同样的answer 再次以更好的解释打败了我。
  • @SunnyJuneja 我知道我最近写了一些关于这个的东西……
【解决方案2】:

在 Ruby 中只有两个 non-true 值:falsenil。您需要做的就是区分这些。直到自动执行此操作的新 //= 运算符出现之前,您都会遇到以下问题:

if (x.nil?)
  x = true
end

希望这可以在 ruby​​ 的未来版本中被缩写。 99% 的时间你并不真正关心两个非真实值之间的差异,但有 1% 的时间你这样做会变得很烦人,不得不如此冗长。

请记住,defined? 运算符将始终针对该条件返回 "local-variable",因为变量 x 被“定义”为局部变量。与defined?(nope) 对比,您将得到nil,因为该变量不存在。 Ruby 关注的是有问题的变量或常量,而不是该变量或常量是否已定义带有值。

【讨论】:

  • x = true if x.nil?,对我来说,它比||= 更易读!
  • 我知道这可能看起来很明显,但您需要在代码中的某处添加x,因为class A; def self.check; if x.nil?; x = true; end; end; end; A.check; 将返回undefined local variable 异常。
  • 根据海报的上下文,这实际上可能是错误的。如果您在 IRB 中执行此操作,则会导致 undefined local variable 异常,作为工作示例,发帖人没有并分配 x = true
  • 感谢您的回复,但您的示例只有在之前未定义 x 时才有效。否则,它会以NameError: undefined local variable or method 'x' for main:Object 失败。在我的情况下,不确定 x 是否会被先前定义,这就是我使用defined? 检查的原因。抱歉,如果问题不清楚。
  • 是的,您必须在使用变量之前在某处定义变量。最好使用不能不存在的 @x 之类的实例变量。
【解决方案3】:
x = defined?(x) ? true  : false

【讨论】:

  • -1 这将使x 成为false,即使它已经是true
  • @AndrewMarshall 你的意思是说它会使x 成为true,即使它已经是false
  • @evanrmurphy 是的,我把两者颠倒了。
猜你喜欢
  • 2013-03-06
  • 2019-11-09
  • 2015-03-28
  • 2020-05-21
  • 1970-01-01
  • 2017-04-17
  • 2022-01-25
  • 2019-04-21
  • 2018-10-14
相关资源
最近更新 更多