对于其他类型的变量,我使用||=
,但这对布尔值不起作用(x ||= true
将x指定为true,即使x先前已分配为false)。
我认为这会奏效:
x = true unless defined?(x)
但事实并非如此:由于某种原因,它将x分配给nil。 (这里的解释将不胜感激。)
我知道一种方法有效:
unless defined?(x)
x = true
end
但它相当冗长。有没有更简洁的方法在Ruby中为布尔变量赋值默认值?
答案 0 :(得分:10)
您必须首先defined?
,否则解析器会到达x =
,然后在运行之前定义x
(使其成为nil
) unless
:
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中只有两个非真实的值:false
和nil
。您需要做的就是区分它们。直到执行此操作的新//=
运算符自动出现之前,您仍然坚持这一点:
if (x.nil?)
x = true
end
希望这可以在未来版本的ruby中缩写。 99%的时间你并不真正关心两个非真实值之间的差异,但是你做这件事的时间有1%变得很烦人,必须非常冗长。
请记住,defined?
运算符将始终为该条件返回"local-variable"
,因为变量x
被“定义”为局部变量。与defined?(nope)
对比,您将获得nil
,因为该变量不存在。 Ruby关注的是变量或常量,而不是该变量或常量是否已定义值。
答案 2 :(得分:-1)
x = defined?(x) ? true : false