【问题标题】:Inject outer scope when monkey-patching instance method in Ruby [duplicate]在 Ruby 中为猴子修补实例方法时注入外部作用域 [重复]
【发布时间】:2015-05-26 23:50:21
【问题描述】:

我有一个容器类 Foo 和一个方法 frob,我想添加一个类似命名的方法,该方法将委托给容器,每个包含的元素。

第一次尝试

  self.children.each do |c|
    def c.frob
      self.frob
    end
  end

但这当然会导致SystemStackError: stack level too deep,因为此时selfc。然后我尝试了

  parent = self
  self.children.each do |c|
    def c.frob
      parent.frob
    end
  end

但是局部变量不是新定义方法的闭包的一部分,所以我得到undefined local variable or method 'parent'

我想出了以下技巧,它很有效:

  self.children.each do |c|
    c.instance_variable_set('@parent', self)
    def c.frob
      @parent.frob
    end
  end

但是,它会污染孩子的变量空间,而这只是这一种方法所需要的。如何在保持新定义的方法自包含的同时获得parent/self

【问题讨论】:

    标签: ruby closures metaprogramming


    【解决方案1】:

    这应该可行:

    children.each do |c|
      parent = self
      c.send(:define_method, :frob) do
        parent.frob
      end
    end
    

    【讨论】:

    • 1.9+ define_singleton_method 变得更加干净。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2012-05-07
    • 2016-11-23
    • 2010-10-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多