在ruby中,是否可以重新定义添加方法的执行上下文?

时间:2015-02-20 12:03:17

标签: ruby

例如

class Foo

  def bar
  end

end

在该代码中,bar只能在该类的任何实例中使用。

是否可以将方法的执行上下文更改为Eigenclass 而无需更改方法本身的定义方式,以便该方法现在可以作为单例使用而无需调用self.new

我希望能够通过Foo可以继承的类添加到代码中的任何代码执行此操作。

目前我正在做的事情相当于:

class Test

  def method_added method
    self.define_singleton_method method do 
      self.new.send method
    end
  end

end

并且由于我正在通过调用new来更改执行上下文,因此我无需工作。

2 个答案:

答案 0 :(得分:0)

我刚刚研究了如何做> _<。

以下是代码:

class Test
    def method_added method
        m = self.new.method(method) #get method object
        self.define_singleton_method(method) do #create method with same name within the singleton class 
             m.call  #call the block which will now run the code of the added method within the context of the Eigenclass/Singleton
        end
    end
end

它的作用是它从一个实例中获取一个方法对象,然后将该方法作为一个块在该类的上下文中调用。

所以第一个代码示例变为:

class Foo < Test

  def bar

  end

end

现在可以访问方法bar Foo.bar而不是Foo.new.bar,这意味着没有实例创建;除了它在方法中添加的时间,但这很好,因为它是获得方法对象的唯一方法,据我所知。

这就是为什么最好只在继承类时(在def self.inherited内)创建一个实例,将它存储在类中,然后只访问它而不是调用{{1 }}

答案 1 :(得分:0)

您可以这样做:

class Test
  def self.method_added method
    module_function method  
  end
end

class A < Test
  def foo
    :hello
  end
end

A.foo #=> :hello