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

如何在Ruby中设置布尔默认值?,ruby,Ruby,对于其他类型的变量,我使用| |=,但这不适用于布尔值(x | |=true将x指定为true,即使x之前被指定为false) 我原以为这样行得通: x = true unless defined?(x) 但事实并非如此:出于某种原因,它将x赋值为nil。(请在此解释。) 我确实知道一种有效的方法: unless defined?(x) x = true end 但它相当冗长。在Ruby中,是否有更简洁的方法为布尔变量指定默认值?Ruby中只有两个非真值:false和nil。你所需要做的

对于其他类型的变量,我使用
| |=
,但这不适用于布尔值(
x | |=true
将x指定为true,即使x之前被指定为false)

我原以为这样行得通:

x = true unless defined?(x)
但事实并非如此:出于某种原因,它将x赋值为nil。(请在此解释。)

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

unless defined?(x)
  x = true
end
但它相当冗长。在Ruby中,是否有更简洁的方法为布尔变量指定默认值?

Ruby中只有两个非真值:
false
nil
。你所需要做的就是区分这些。在自动执行此操作的新的
/=
运算符出现之前,您必须遵守以下规则:

if (x.nil?)
  x = true
end
希望这可以在ruby的未来版本中简化。99%的时候你并不真正关心这两个非真值之间的差异,但有1%的时候你会觉得非常烦人,不得不如此冗长


请记住,
defined?
运算符将始终为该条件返回
“局部变量”
,因为变量
x
被“定义”为局部变量。与
defined?(nope)
相比,您将得到
nil
,因为该变量不存在。Ruby关心的是所讨论的变量或常量,而不是该变量或常量是否已用值定义。

必须先定义
,否则解析器在运行
之前到达
x=
,然后定义
x
(这使得
为nil
),除非

defined?(x) or x = true
x  #=> true
执行
if
/
除非
块(而不是post-
if
/
除非
一行程序)也可以:

unless defined?(x)
  x = true
end
x  #=> true

或者如果x.nil?
,则为
x=true,对我来说,这比
|124;=
习惯用法更可读!我知道这看起来很明显,但是你需要在你的代码中有
x
,因为
class A;def自检;如果x.nil?;x=真;结束;结束;结束;检查
将返回一个
未定义的局部变量
异常。根据海报的上下文,这实际上可能是错误的。如果在IRB中执行此操作,则会导致
未定义的局部变量
异常,其中作为工作示例,海报没有并指定
x=true
。感谢您的回复,但只有在之前未定义x的情况下,您的示例才是好的。否则,它将失败,原因是
namererror:undefined局部变量或main:Object的方法“x”
。在我的例子中,不确定x之前是否会被定义,这就是为什么我要用
defined?
检查的原因。抱歉,如果这个问题不清楚的话。是的,在使用变量之前,你必须在某个地方定义变量。最好使用像
@x
这样不可能存在的实例变量。你用更好的解释再次击败了我。@SunnyJuneja我知道我最近写了一些关于这个的东西……你有什么理由不想让x被指定为nil(这在所有意图和目的上都相当于false)?@sylvain.joyeux,因为他希望它是
真的
,而不是假的。@sylvain.joyeux使用nil代替false是可以的,但它不能解决
| |=
的问题。如果您尝试使用
| |=
将默认值指定给x,并且x以前被指定为nil,则它将被覆盖,而不是保留nil的值(因为nil是错误的)-1这将使
x
变为
false
即使它已经是
真的
@andremarshall你的意思是说它会使
x
变为
真的
即使它已经是
假的
?@evarmurphy是的,我颠倒了这两个。
unless defined?(x)
  x = true
end
x  #=> true
x = false
unless defined?(x)
  x = true
end
x  #=> false
x = defined?(x) ? true  : false