代码之家  ›  专栏  ›  技术社区  ›  Roja Buck

直通方法

  •  2
  • Roja Buck  · 技术社区  · 16 年前

    是否有人知道提供直通方法的方法,以提供类似以下内容但添加了干燥的方法?

    class Cover
    
      @some_class = SomeClass.new
    
      def some_method
        @some_class.some_method
      end
    
    end
    

    理想情况下,我想把它烘干成这样:

    class Cover
    
      @some_class = SomeClass.new
      passthrough @some_class.some_method
    
    end
    

    如果没有猴子来修补我的生活,人们还有什么吗?

    干杯,

    罗杰

    4 回复  |  直到 16 年前
        1
  •  2
  •   ry.    16 年前

    Forwadable 可能是你想要的:

    class Cover
      extend Forwardable
    
      def initialize
         @some_class = SomeClass.new
      end
    
      def_delegator @some_class, :some_method
    
    end
    

    Forwardable在类级别上工作,但也可以使用SingleForwardable进行对象级别的委托。

        2
  •  8
  •   Chris McCauley    16 年前

    对授权模式的支持


    代表


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

    此库提供三种不同的方法来将方法调用委托给对象。最容易使用的是simpleDelegator。将一个对象传递给构造函数,对象支持的所有方法都将被委托。稍后可以更改此对象。

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

    最后,如果需要完全控制委托方案,可以从抽象类委托程序继承并根据需要进行自定义。(如果您发现自己需要此控件,请查看标准库中的Forwardable。它可能更适合您的需要。)


    可转发的


    还有 forwardable 图书馆

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

        3
  •  0
  •   user253455    16 年前

    两个方向,一个纯红宝石,一个轨道。

    红宝石: 来自Forwardable的Def_授权程序 http://ruby-doc.org/stdlib/libdoc/forwardable/rdoc/classes/Forwardable.html

    栏杆: 代表 http://api.rubyonrails.org/classes/Module.html#M000110

        4
  •  0
  •   Josh Matthews    16 年前

    您可以重写内核的 method_missing 像这样:

    class Bar
      def method_missing(method, *args)
        @delegate.send(method, *args) if @delegate.respond_to? method
      end
    end
    
    推荐文章