web-dev-qa-db-ja.com

Ruby変数がまだ定義されていない場合は設定します

Rubyでは、変数がまだ定義されていない場合、どのようにして特定の値に設定し、既に定義されている場合は現在の値のままにしますか?

41
jrdioko

x ||= valueは、「もしxがnilを含むfalsey値を含んでいる場合(これはこの構成で暗黙的ですifxは、割り当ての左側で)、値をx "に割り当てます。それはまさにそれを行います。

以下と同等のroughlyです。 (しかしながら、 x ||= valueはこのコードmayのようにNameErrorをスローせず、常にこのようにxに値を割り当てます。コードはそうではありません-ポイントはx ||= valueは、anyxのfalse値(「デフォルト」nil値を含む)でも同じように機能します。

if !x
  x = value
end  

変数に値が割り当てられていないtrulyがあるかどうかを確認するには、defined? 方法:

>> defined? z
=> nil                                                                  
>> z = nil                                                              
=> nil                                                                  
>> defined? z                                                           
=> "local-variable"                                                     
>> defined? @z                                                          
=> nil                                                                  
>> @z = nil                                                             
=> nil                                                                  
>> defined? @z                                                          
=> "instance-variable" 

ただし、では、ほぼすべての場合defined?はコードの匂いです。電源に注意してください。賢明なことをしてください:変数を使用する前に変数値を与えてください:)

ハッピーコーディング。

47
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" 
25
thenengah

どのような種類の変数を指定しなかったため:

v = v
v ||= 1

ただし、ローカル変数でこれを行うことはお勧めしません。

編集:実際にはv = vは必要ありません

7
Victor Moroz

少し遅れましたが、偽の値(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
2
sprestel

変数が定義されていない(宣言されている?)場合、変数は存在せず、宣言されている場合は、初期化の方法がわかりますよね?

通常、用途がまだわからない変数だけが必要な場合---never Booleanとして使用----値をnilに設定して初期化します。その後、後で簡単に変更されたかどうかをテストできます

x = nil


some code


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

それで全部です。

0
Dmitri