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

时间:2012-11-09 04:59:11

标签: ruby

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

我认为这会奏效:

x = true unless defined?(x)

但事实并非如此:由于某种原因,它将x分配给nil。 (这里的解释将不胜感激。)

我知道一种方法有效:

unless defined?(x)
  x = true
end

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

3 个答案:

答案 0 :(得分:10)

您必须首先defined? ,否则解析器会到达x =,然后在运行之前定义x(使其成为nilunless

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

答案 1 :(得分:3)

Ruby中只有两个非真实的值:falsenil。您需要做的就是区分它们。直到执行此操作的新//=运算符自动出现之前,您仍然坚持这一点:

if (x.nil?)
  x = true
end

希望这可以在未来版本的ruby中缩写。 99%的时间你并不真正关心两个非真实值之间的差异,但是你做这件事的时间有1%变得很烦人,必须非常冗长。

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

答案 2 :(得分:-1)

x = defined?(x) ? true  : false