设置Ruby变量(如果尚未定义)

jrd*_*oko 43 ruby variables set

在Ruby中,如果变量尚未定义,如何将变量设置为某个值,如果已定义,则保留当前值?

小智 50

虽然x ||= value可以说"如果x包含一个假值,包括nil(如果 x未定义因为它出现在赋值的左侧,则隐含在此构造中),为x"赋值,它只是那.

大致相当于以下内容.(不过,x ||= value不会抛出NameError这样的代码可以和它总是一个值分配给x作为此代码不-关键是看x ||= value作品同为任何在X falsey值,包括"默认" nil值):

if !x
  x = value
end  
Run Code Online (Sandbox Code Playgroud)

要查看变量是否确实没有赋值,请使用以下defined?方法:

>> defined? z
=> nil                                                                  
>> z = nil                                                              
=> nil                                                                  
>> defined? z                                                           
=> "local-variable"                                                     
>> defined? @z                                                          
=> nil                                                                  
>> @z = nil                                                             
=> nil                                                                  
>> defined? @z                                                          
=> "instance-variable" 
Run Code Online (Sandbox Code Playgroud)

但是,几乎所有情况下,使用defined?代码气味.小心电源.做明智的事情:在尝试使用它们之前给出变量值:)

快乐的编码.

  • @jrdioko"魔术师";)其实,它与`x`出现在分配的左侧做 - 如果值尚未分配也没关系,但(这将"默认"为'零`).例如,`z = z.nil?#=> true`即使当前没有定义`z`. (2认同)

the*_*gah 26

@variable ||= "set value if not set"
Run Code Online (Sandbox Code Playgroud)

因此false变量将被覆盖

> @test = true 
 => true 
> @test ||= "test"
 => true 
> @test 
 => nil 
> @test ||= "test"
 => "test" 
> @test = false 
 => false 
> @test ||= "test"
 => "test" 
Run Code Online (Sandbox Code Playgroud)

  • 但是,它可以设置为假值.因此,这只是大致正确的. (2认同)

Vic*_*roz 7

因为你没有指定什么样的变量:

v = v
v ||= 1
Run Code Online (Sandbox Code Playgroud)

不建议使用局部变量执行此操作.

编辑:实际上不需要v = v