irb
を使用しているとしましょうa = 5
。a
入力するとa
が返されるように の定義を削除するにはどうすればよいNameError
ですか?
いくつかのコンテキスト:後で私はこれをしたい:
context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a' # though this doesn't work.
irb
を使用しているとしましょうa = 5
。a
入力するとa
が返されるように の定義を削除するにはどうすればよいNameError
ですか?
いくつかのコンテキスト:後で私はこれをしたい:
context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a' # though this doesn't work.
remove_class_variable、remove_instance_variable、およびremove_constメソッドがありますが、現在、ローカル変数に相当するものはありません。
irb サブシェルを呼び出すことで、irb のローカル変数のレジストリをいつでも「クリア」できます。エクスポートされていない環境変数に関して Bash シェルがどのように機能するかを考えてみてください。インタラクティブモードについて言及したので、このソリューションはそのために機能するはずです。
本番コードに関しては、ソリューションの一部としてローカル変数を定義解除したくありません。そのようなシナリオには、キー付きハッシュの方がおそらく適しているでしょう。
これが私が意味することです:
$ irb
irb(main):001:0> a = "a"
=> "a"
irb(main):002:0> defined? a
=> "local-variable"
irb(main):003:0> irb # step into subshell with its own locals
irb#1(main):001:0> defined? a
=> nil
irb#1(main):002:0> a
NameError: undefined local variable or method `a' for main:Object
from /Users/dean/.irbrc:108:in `method_missing'
from (irb#1):2
irb#1(main):003:0> exit
=> #<IRB::Irb: @context=#<IRB::Context:0x1011b48b8>, @signal_status=:IN_EVAL, @scanner=#<RubyLex:0x1011b3df0>>
irb(main):004:0> a # now we're back and a exists again
=> "a"
現在、グローバル変数、ローカル変数、およびクラス変数を削除する手段はありません。ただし、「remove_const」メソッドを使用して定数を削除できます