以下所有def调用的Ruby调用方法?

时间:2011-01-20 12:07:42

标签: ruby

我见过一些代码,它们创建了一个类方法,可以编写

class_method :instance_method,

到别名instance_method并在每次调用时使用包装器方法调用它。有没有办法可以调用class_method并让它适用于以下所有定义调用(例如private如何工作)?

1 个答案:

答案 0 :(得分:1)

我不太明白你的问题。将来,请提供您正在尝试的内容的规范,最好是以可执行测试套件的形式,以便我们可以自己检查我们的答案是否真的回答您的问题

你是在谈论这样的事情吗?

module MethodHook
  private

  def class_method(m=nil)
    return if @__recursing__ # prevent infinite recursion
    return @__class_method__ = true unless m

    @__recursing__ = true

    old_m = instance_method(m)
    define_method(m) do |*args, &block|
      puts "before #{m}(#{args.join(', ')})" # wrap wrap wrap
      old_m.bind(self).(*args, &block)
      puts "after #{m}" # more wrapping
    end

    @__recursing__ = nil
  end

  def method_added(m)
    class_method(m) if @__class_method__
    super
  end
end

像这样使用:

class Foo
  extend MethodHook

  def unwrapped
    puts __method__
  end

  class_method

  def wrapped
    puts __method__
  end
end

f = Foo.new

f.unwrapped
# unwrapped

f.wrapped
# before wrapped()
# wrapped
# after wrapped

class Foo
  class_method(:unwrapped)
end

f.unwrapped
# before unwrapped()
# wrapped
# after unwrapped