ruby – 在对象范围内创建空白绑定
发布时间:2020-12-17 03:24:08 所属栏目:百科 来源:网络整理
导读:class Foo def self.run(n,code) foo = self.new(n) @env = foo.instance_eval{ binding } @env.eval(code) end def initialize(n) @n = n endendFoo.run( 42,"p @n,defined? foo" )#= 42#= "local-variable" 上面的示例程序旨在评估Foo实例范围内的任意代码
class Foo def self.run(n,code) foo = self.new(n) @env = foo.instance_eval{ binding } @env.eval(code) end def initialize(n) @n = n end end Foo.run( 42,"p @n,defined? foo" ) #=> 42 #=> "local-variable" 上面的示例程序旨在评估Foo实例范围内的任意代码.它这样做,但绑定被代码方法中的局部变量“污染”.我不希望foo,n或代码对eval’d代码可见.所需的输出是: #=> 42 #=> nil 如何创建(a)在对象实例范围内的绑定,但(b)没有任何局部变量? 我创建绑定而不是仅使用instance_eval(代码)的原因是在real usage中我需要keep the binding around for later usage,以保留在其中创建的局部变量. 解决方法
这样吗?还是我错过了一些重要的事情?
class Foo attr_reader :b def initialize(n) @n = n @b = binding end def self.run(n,code) foo = self.new(n) foo.b.eval(code) end end Foo.run(42,defined?(foo)") # 42 # nil 或进一步向下移动以获得更少的背景 class Foo def initialize(n) @n = n end def b @b ||= binding end def self.run(n,defined?(foo),defined?(n)") # 42 # nil # nil (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |