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

时间:2011-07-12 21:33:50

标签: ruby variables set

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

5 个答案:

答案 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

就是这样。