-
18-09-2019 - |
質問
ということかを使用してい 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 方法がありませんが相当地の変数.
他のヒント
あなたは変数が存在する範囲を減らすことによって、変数を解除宣言を避けることができます:
def scope
yield
end
scope do
b = 1234
end
b # undefined local variable or method `b' for main:Object
あなたのことができ、常に「クリア」IRBのレジストリ。バッシュシェルはアンエクスポート環境変数に関してどのように動作するかを考えます。あなたが対話モードをmetionedので、このソリューションは、そのために働くべきです。
限り生産コードとして、私は、ソリューションの一部としてローカル変数を未定義のは嫌だ - キー付きハッシュはおそらくシナリオのそのタイプの方が良いでしょう。
。ここで私の意味は次のとおりです。
$ 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"
現在、あなたは、グローバル変数、ローカル変数とクラス変数を削除するには、no平均を持っていません。あなたは、
けれども「remove_const」メソッドを使用して、定数を削除することができます質問の精神では、あなたが他のローカル変数が同じスコープにロックされていると大丈夫ですと仮定すると、スコープに変数を制限することができます。これは、クラスで何かを定義していると、ローカル変数は、クラス宣言の周りに滞在したくない場合は特に便利です。
これを行うには、私が考えることができる唯一の方法はそうのようなInteger#times
またはArray#each
である。
1.times do |a|
a = 5
# code…
end
[5].each do |a|
# code…
end
このほかにブロックに制限するための、おそらく他、でもクリーンな方法があります。これらは私がしたいと私は、誰かがこれを行うために使用するクリーナーの方法を持っているかどうかを確認してみたいほどきれいではありません。