在Ruby中,如果变量尚未定义,如何将变量设置为某个值,如果已定义,则保留当前值?
答案 0 :(得分:47)
虽然x ||= value
是一种说“如果x包含一个假值,包括nil(这是隐含在此构造中,如果 x未定义,因为它出现在左侧)在赋值的一侧),为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?
都是代码味道。请注意电源。做明智的事情:在尝试使用它们之前给出变量值:)
快乐的编码。
答案 1 :(得分:21)
@variable ||= "set value if not set"
所以false
变量将被覆盖
> @test = true
=> true
> @test ||= "test"
=> true
> @test
=> nil
> @test ||= "test"
=> "test"
> @test = false
=> false
> @test ||= "test"
=> "test"
答案 2 :(得分:6)
由于您没有指定哪种变量:
v = v
v ||= 1
不建议使用局部变量执行此操作。
编辑:实际上不需要v = v
答案 3 :(得分:2)
有点晚但是一个工作解决方案也没有覆盖假名值(包括nil
):
# assuming x is not defined in current scope
!defined?(x) ? x = 42 : nil # => x == 42
y = false
!defined(y) ? y = 42 : nil # => x == false
z = nil
!defined(z) ? z = 42 : nil # => z == nil
答案 4 :(得分:0)
如果未定义变量(声明?),则它不存在,如果声明了,那么你知道如何初始化它,对吗?
通常,如果我只需要一个我还不知道的变量 - 我知道永远不会用作布尔值 - 我通过将其值设置为nil来初始化它。然后你可以测试以后是否很容易改变
x = nil
some code
if x do
[code that will only run if x has changed]
end
就是这样。