您如何在Ruby中设置布尔值默认值



对于其他类型的变量,我使用||=,但这对布尔值不起作用(即使先前已分配给false),x ||= true将X分配给True)。

我认为这会起作用:

x = true unless defined?(x)

但不是:它由于某种原因将X分配给零。(这里的解释将不胜感激。)

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

unless defined?(x)
  x = true
end

,但这很冗长。是否有一种更简洁的方法可以将默认值分配给Ruby中的布尔变量?

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

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

执行if/unless块(而不是Post-if/unless单线)也有效:

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

Ruby:falsenil中只有两个 non-true 值。您需要做的就是区分这些。在自动执行此操作的新的//=操作员之前,您一直坚持这样做:

if (x.nil?)
  x = true
end

希望这可以在Ruby的未来版本中缩写。99%的时间,您并不真正在乎两个非真实值之间的区别,但是您这样做的1%的时间很烦人,必须变得如此异常。

请记住,defined?操作员将始终返回该条件的"local-variable",因为变量x被"定义"为本地变量。与defined?(nope)形成对比,您将获得nil,因为该变量不存在。Ruby关注的是所讨论的变量或常数,而不是该变量或常数是否已被定义为具有值。

x = defined?(x) ? true  : false

最新更新