如何在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