对于其他类型的变量,我使用||=
,但这不适用于布尔值(x ||= true
即使 x 先前已分配为 false,也将 x 分配给 true)。
我认为这会起作用:
x = true unless defined?(x)
但它没有:它出于某种原因将 x 分配给 nil 。(这里的解释将不胜感激。)
我确实知道一种有效的方法:
unless defined?(x)
x = true
end
但它比较冗长。有没有更简洁的方法来为 Ruby 中的布尔变量分配默认值?
对于其他类型的变量,我使用||=
,但这不适用于布尔值(x ||= true
即使 x 先前已分配为 false,也将 x 分配给 true)。
我认为这会起作用:
x = true unless defined?(x)
但它没有:它出于某种原因将 x 分配给 nil 。(这里的解释将不胜感激。)
我确实知道一种有效的方法:
unless defined?(x)
x = true
end
但它比较冗长。有没有更简洁的方法来为 Ruby 中的布尔变量分配默认值?
您必须首先拥有defined?
,否则解析器会在运行之前到达x =
并定义x
(使其成为) :nil
unless
defined?(x) or x = true
x #=> true
x = false
defined?(x) or x = true
x #=> false
做一个if
/unless
块(而不是 post- if
/ unless
one-liner)也有效:
unless defined?(x)
x = true
end
x #=> true
x = false
unless defined?(x)
x = true
end
x #=> false
Ruby中只有两个非真false
值:和nil
. 您需要做的就是区分这些。在自动执行此操作的新//=
操作员出现之前,您会遇到以下问题:
if (x.nil?)
x = true
end
希望这可以在未来的 ruby 版本中被缩写。99% 的时间你并不真正关心这两个非真实值之间的差异,但有 1% 的时间你这样做会变得很烦人,不得不如此冗长。
请记住,defined?
运算符将始终"local-variable"
针对该条件返回,因为该变量x
被“定义”为局部变量。对比,defined?(nope)
你会得到nil
,因为那个变量不存在。Ruby 关心的是有问题的变量或常量,而不是该变量或常量是否已用值定义。
x = defined?(x) ? true : false