在Ruby中,如果变量未被定义,您如何将变量设置为特定值,并保留当前值(如果已经定义)?
当 x ||= value
这样用时,它的意义是:如果 x 的值为 falsey,包括 nil(因为在赋值语句左边出现,所以它是隐含的),则将 value 赋值给 x。但这个操作只会做一次。
大致等同于以下代码。(但是,x ||= value
不会像这段代码 可能 抛出 NameError
异常,并且无论如何都会给 x
赋值,而这段代码不会。重点是要看出 x ||= value
对于 x 中的 任何 falsey 值,包括“默认”的 nil
值,都能产生相同的效果):
if !x
x = value
end
要查看变量是否真正未被赋值,请使用defined?
方法:
>> defined? z
=> nil
>> z = nil
=> nil
>> defined? z
=> "local-variable"
>> defined? @z
=> nil
>> @z = nil
=> nil
>> defined? @z
=> "instance-variable"
然而,在几乎所有情况下,使用defined?
都是代码异味。小心使用权力。做明智的事情:在尝试使用变量之前给它们赋值 :)
愉快的编码。
x
有关--即使尚未分配值(它将“默认”为 nil
),也不会影响。例如,即使当前未定义 z
,z = z.nil? # => true
仍然成立。 - user166390NameError
!(并通过良好的测试覆盖进行验证);-) - user166390@variable ||= "set value if not set"
所以false
变量将被覆盖
> @test = true
=> true
> @test ||= "test"
=> true
> @test
=> nil
> @test ||= "test"
=> "test"
> @test = false
=> false
> @test ||= "test"
=> "test"
> @test
should be > @test = nil
- EliadLbodyParams['owner'] ||= ''
这样的哈希值就无法工作。它会给你一个IndexError
。关于这个问题,请查看这里https://dev59.com/GlkS5IYBdhLWcg3ws4gk#39549523 - Chris由于您没有指定什么类型的变量:
v = v
v ||= 1
不建议使用局部变量来实现这个。
编辑:事实上,v=v并不需要。
如果变量未定义(声明?),则它不存在,如果已声明,则知道如何初始化它,对吧?
通常,如果我只需要一个变量,但还不知道如何使用它 - 我知道永远不会将其用作布尔值 - 我会通过将其值设置为nil来初始化它。然后稍后可以轻松测试它是否已更改。
x = nil
some code
if x do
[code that will only run if x has changed]
end
就这些。