Ruby中的Undefine变量

时间:2010-01-06 08:18:19

标签: ruby metaprogramming local-variables

假设我正在使用irb,并输入a = 5。如何删除a的定义,以便输入a返回NameError

某些背景:后来我想这样做:

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

5 个答案:

答案 0 :(得分:46)

remove_class_variableremove_instance_variableremove_const方法,但目前没有相应的局部变量。

答案 1 :(得分:22)

您可以通过减少变量存在的范围来避免取消声明变量:

def scope 
  yield
end

scope do 
  b = 1234
end

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

答案 2 :(得分:13)

你总是可以通过调用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"

答案 3 :(得分:0)

目前,您无意删除全局变量,局部变量和类变量。您可以使用“remove_const”方法删除常量,但

答案 4 :(得分:0)

本着问题的精神,假设您可以将其他局部变量锁定在同一范围内,则可以将变量限制为范围。当您在类中定义某些内容并且不希望局部变量保留在类声明中时,此功能特别有用。

我唯一想到的方法是像这样使用Integer#timesArray#each

1.times do |a|
  a = 5
  # code…
end

[5].each do |a|
  # code…
end

除此之外,可能还有其他甚至更清洁的方法来限制一个块。这些不像我想要的那样干净,我很想看看是否有人可以使用一种更清洁的方法来做到这一点。