在 Ruby 中取消定义变量
-
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.
其他提示
您可以通过缩小变量存在的范围来避免取消声明变量:
def scope
yield
end
scope do
b = 1234
end
b # undefined local variable or method `b' for main:Object
您始终可以通过调用 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"
目前您无法删除全局变量、局部变量和类变量。您可以使用“remove_const”方法删除常量
本着问题的精神,您可以将变量限制在一个范围内,假设您可以将其他局部变量锁定在同一范围内。如果您在类中定义某些内容并且不希望局部变量保留在类声明中,这尤其有用。
我能想到的唯一方法是 Integer#times
或者 Array#each
像这样:
1.times do |a|
a = 5
# code…
end
[5].each do |a|
# code…
end
除此之外,可能还有其他甚至更干净的方法来限制块。这些并不像我想要的那么干净,我很想看看是否有人有更干净的方法来执行此操作。
不隶属于 StackOverflow