加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读