2010-01-06 74 views
38

假設我正在使用irb,並輸入a = 5。如何刪除a的定義,以便打字a返回NameErrorRuby中的未定義變量

一些背景:以後我想這樣做:

context = Proc.new{}.binding 
context.eval 'a = 5' 
context.eval 'undef a' # though this doesn't work. 

回答

41

remove_class_variable,remove_instance_variableremove_const方法,但目前沒有等效的局部變量。

+0

嗯,惱人的是,沒有任何這樣的方法。我想我現在可以堅持實例變量。 – Peter 2010-01-06 20:43:55

+0

這些鏈接看起來不像他們要去的地方了。 – jcollum 2012-01-16 22:53:27

+2

@jcollum謝謝。 'remove_instance_variable'和'remove_const'是私有方法,所以似乎不再包含在ruby-doc.org的文檔中。我更新了答案,使用等效鏈接到apidock.com – mikej 2012-01-17 17:32:29

1

目前,你有沒有平均去除全局變量,局部變量和類變量。您可以使用「remove_const」方法刪除常量,雖然

+3

事實並非如此類的變量 - 有remove_class_variable。 – mikej 2010-01-06 10:13:22

+1

哦!謝謝mikej。不知道:) – Nakul 2010-01-06 14:34:51

11

您可以通過調用一個irb子shell來「清除」irb的局部變量註冊表。想想Bash shell如何處理未導出的環境變量。由於您提到了交互模式,因此該解決方案應該可以爲此工作。就生產代碼而言,我不想將局部變量定義爲解決方案的一部分 - 對於這種類型的場景,鍵控哈希可能會更好。

這裏就是我的意思是:

$ 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" 
15

您可以通過減少其中的變量存在的範圍避免未聲明的變量:

def scope 
    yield 
end 

scope do 
    b = 1234 
end 

b # undefined local variable or method `b' for main:Object 
+2

這是我想看到的答案。 – 2014-12-14 15:05:35