メソッドの委譲を実現する。 例えば内部的に配列を持ちながらCollectionを表現するクラスを作る場合、eachを配列に委譲すると便利。
require "forwardable"
class Collection
extend Forwardable
include Enumerable
delegate_defs :@list, :each, :size
def initialize(list)
@list = list
end
end
ActiveSupportにもdelegateを支援する機能がある。 これは内部実装的には宣言した瞬間にメソッドを定義するというやつなのだけど、便利なのでよく使う。 上記のForwardableの例はModule#delegateを利用して下記のように記述できる。
require "active_support/core_ext/module/delegation"
class Collection
extend Forwardable
include Enumerable
delegate :each, :size, :to => :@list
def initialize(list)
@list = list
end
end