9

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

我认为这会起作用:

x = true unless defined?(x)

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

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

unless defined?(x)
  x = true
end

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

4

3 回答 3

12

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

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

做一个if/unless块(而不是 post- if/ unlessone-liner)也有效:

unless defined?(x)
  x = true
end
x  #=> true
x = false
unless defined?(x)
  x = true
end
x  #=> false
于 2012-11-09T05:22:22.793 回答
3

Ruby中只有两个非真false值:和nil. 您需要做的就是区分这些。在自动执行此操作的新//=操作员出现之前,您会遇到以下问题:

if (x.nil?)
  x = true
end

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

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

于 2012-11-09T05:01:55.210 回答
-1
x = defined?(x) ? true  : false
于 2012-11-09T07:11:23.307 回答