Rubyでは、変数がまだ定義されていない場合、どのようにして特定の値に設定し、既に定義されている場合は現在の値のままにしますか?
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?
はコードの匂いです。電源に注意してください。賢明なことをしてください:変数を使用する前に変数値を与えてください:)
ハッピーコーディング。
@variable ||= "set value if not set"
したがって、false
変数はオーバーライドされます
> @test = true
=> true
> @test ||= "test"
=> true
> @test
=> nil
> @test ||= "test"
=> "test"
> @test = false
=> false
> @test ||= "test"
=> "test"
どのような種類の変数を指定しなかったため:
v = v
v ||= 1
ただし、ローカル変数でこれを行うことはお勧めしません。
編集:実際にはv = vは必要ありません
少し遅れましたが、偽の値(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
変数が定義されていない(宣言されている?)場合、変数は存在せず、宣言されている場合は、初期化の方法がわかりますよね?
通常、用途がまだわからない変数だけが必要な場合---never Booleanとして使用----値をnilに設定して初期化します。その後、後で簡単に変更されたかどうかをテストできます
x = nil
some code
if x do
[code that will only run if x has changed]
end
それで全部です。