对于其他类型的变量,我使用||=
,但这对布尔值不起作用(即使先前已分配给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:false
和nil
中只有两个 non-true 值。您需要做的就是区分这些。在自动执行此操作的新的//=
操作员之前,您一直坚持这样做:
if (x.nil?)
x = true
end
希望这可以在Ruby的未来版本中缩写。99%的时间,您并不真正在乎两个非真实值之间的区别,但是您这样做的1%的时间很烦人,必须变得如此异常。
请记住,defined?
操作员将始终返回该条件的"local-variable"
,因为变量x
被"定义"为本地变量。与defined?(nope)
形成对比,您将获得nil
,因为该变量不存在。Ruby关注的是所讨论的变量或常数,而不是该变量或常数是否已被定义为具有值。
x = defined?(x) ? true : false