3
私はカーネル#global_variablesを通してすべてのグローバル変数を見ることができますが、remove_instance_variable、remove_class_variable、remove_constメソッドと同様にそれらを削除する方法はありますか?それとも同じことを達成するためにそれらを使う方法がありますか?Rubyでグローバル変数を削除するには?
私はカーネル#global_variablesを通してすべてのグローバル変数を見ることができますが、remove_instance_variable、remove_class_variable、remove_constメソッドと同様にそれらを削除する方法はありますか?それとも同じことを達成するためにそれらを使う方法がありますか?Rubyでグローバル変数を削除するには?
グローバル変数を「設定解除」することは可能ではないと思います。あなたの最善の策は、変数をnil
に設定することです。
通常、定義していない変数を使用しようとすると、Rubyはエラーをスローします。
irb > "The following variable has not yet been defined: #{a}"
irb > NameError: undefined local variable or method `a' for main:Object
この動作は、グローバル変数と実際は異なります。定義されていないグローバル変数を呼び出すと、nil
が返されます。
irb > "The following global variable has not yet been defined: #{$a}"
# => The following global variable has not yet been defined:
irb > $a.class
# => NilClass
したがって、グローバル変数をnilに設定すると、その変数を「設定解除」したときとまったく同じ動作になるはずです。
私はそうは思わない。 (なぜあなたにしたいですか?) –
'nil'値を割り当てることができます。しかし、コメントのように、なぜグローバル変数を定義して削除したいのですか?大域変数は、コードのどこからでも上書きできるので避けるべきです。あなたがそれらを使用する必要がある場合は、極端な慎重さとそれらを使用してください。 – abhinav
gc遅延によるObjectSpace#define_finalizerは、オブジェクトが変数によって参照されなくなったときを知るためにはすぐには不十分かもしれません。 Kernel#trace_varは、変数が変更されたときに呼び出される唯一のコールバックで、グローバルでのみ動作します。 – user10795