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

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

jrdioko asked 2020-08-09T03:51:15Z
5个解决方案
48 votes

虽然defined?是一种说法,即“如果x包含假值,包括nil(如果未定义x(因为它出现在赋值的左侧)则在此构造中隐含),则将值赋给x”,但它确实 只是。

它大致等同于以下内容。 (但是,defined?不会像该代码那样抛出NameError,并且它将始终为x分配一个值,因为该代码不会这样做-关键是要看到x ||= value对于x中的任何假值(包括“默认值” 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?都是代码异味。 小心电源。 做明智的事情:在尝试使用变量之前给变量值:)

快乐的编码。

answered 2020-08-09T03:51:40Z
25 votes
@variable ||= "set value if not set"

因此false变量将被覆盖

> @test = true 
 => true 
> @test ||= "test"
 => true 
> @test 
 => nil 
> @test ||= "test"
 => "test" 
> @test = false 
 => false 
> @test ||= "test"
 => "test" 
thenengah answered 2020-08-09T03:52:00Z
7 votes

由于您没有指定哪种变量:

v = v
v ||= 1

但是不建议您使用局部变量来执行此操作。

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

Victor Moroz answered 2020-08-09T03:52:28Z
2 votes

有点晚了,但是有效的解决方案也不会覆盖虚假值(包括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
sprestel answered 2020-08-09T03:52:48Z
0 votes

如果未定义(声明?)变量,则该变量不存在,如果已声明,那么您知道如何初始化它,对吗?

通常,如果我只需要一个我不知道会使用的变量-我知道它永远不会用作布尔值-我会通过将其值设置为nil来对其进行初始化。 然后,您可以轻松地测试一下是否已对其进行更改

x = nil


some code


if x do 
[code that will only run if x has changed]
end

就这样。

Dmitri answered 2020-08-09T03:53:18Z
translate from https://stackoverflow.com:/questions/6671442/set-ruby-variable-if-it-is-not-already-defined