装饰一个类的所有方法

时间:2013-06-17 09:06:49

标签: ruby

假设我有一个类Caller,它在ruby中调用另一个类的方法(即Abc):

class Caller
    def run
        abc = Abc.new
        abc.method1
        abc.method2
    end
end

class Abc
   def method1
      puts 'Method1 etc'
   end
   def method2
      puts 'Method2 etc'
   end
end

caller = Caller.new
caller.run

每次调用类Abc中的方法时,我都需要使用显示Calling方法类名称和方法名称的前缀来修饰调用 例如。在上面的例子中,我需要以下输出:

Caller.run - Method1 etc
Caller.run - Method2 etc

在ruby中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

您可以创建不会定义任何特定方法的装饰器,但会实现method_missing挂钩,并以您需要的任何代码包装每个调用:

class Caller
  def initialize(object)
    @object = object
  end

  def method_missing(meth, *args, &block)
    puts 'wrapper'
    @object.public_send(meth, *args, &block)
  end
end

class YourClass
  def method1
    puts "method 1"
  end
end

c = Caller.new(YourClass.new)

c.method1

这样你的装饰师就不引人注目了。此外,您可以控制包装的方法调用(例如,通过在method_missing中定义白名单或黑名单)。这是在分离良好的代码块中定义方面行为的非常明确的方法。