Ruby转发方法调用

时间:2010-05-31 08:49:31

标签: ruby class

我有一个生成子类实例的主类实例,这些子类需要将一些方法调用转发回主实例。

目前我的代码看起来像这样,但感觉我应该能够更有效地做同样的事情(也许使用method_missing?)

class Master
  def initalize(mynum)
    @mynum = mynum
  end

  def one_thing(subinstance)
    "One thing with #{subinstance.var} from #{@mynum}"
  end

  def four_things(subinstance)
    "Four things with #{subinstance.var} from #{@mynum}"
  end

  def many_things(times,subinstance)
    "#{times} things with #{subinstance.var} from #{@mynum}"
  end

  def make_a_sub(uniqueness)
    Subthing.new(uniqueness,self)
  end


  class Subthing
    def initialize(uniqueness,master)
      @u = uniqueness
      @master = master
    end

    # Here I'm forwarding method calls
    def one_thing
      master.one_thing(self)
    end

    def four_things
      master.four_things(self)
    end

    def many_things(times)
      master.many_things(times,self)
    end
  end
end

m = Master.new(42)
s = m.make_a_sub("very")

s.one_thing === m.one_thing(s)

s.many_things(8) === m.many_things(8,s)

我希望你能看到这里发生了什么。我会使用method_missing,但我不知道如何应对某些调用有参数的可能性而有些没有(我不能真正重新排列Master方法的参数顺序)

感谢阅读!

1 个答案:

答案 0 :(得分:6)

支持委托模式


代表


Delegate有帮助吗?它允许您将方法委托给第二个类

  

此库提供了三种不同的方法来将方法调用委托给对象。最简单易用的是SimpleDelegator。将对象传递给构造函数,并且将委派对象支持的所有方法。此对象可以在以后更改。

     

更进一步,顶级DelegateClass方法允许您通过类继承轻松设置委派。这是非常灵活的,因此可能是该库的最常见用途。

     

最后,如果您需要完全控制委派方案,则可以从抽象类Delegator继承并根据需要进行自定义。 (如果您发现自己需要这种控制,请查看可转发的,也可以在标准库中。它可能更适合您的需求。)


可转发


还有forwardable

  

此库允许您逐个方法地将方法调用委托给对象。您可以使用Forwardable在类级别设置此委派,或使用SingleForwardable在对象级别处理它。