tips / Ruby

インスタンスメソッドを委譲する

まずはインスタンスメソッドを委譲する方法をいくつか紹介します。

delegateを使う

class User
  delegate :name, :age, to: :info
end

ここではnameageメソッドをinfoに委譲しています。

Forwardable.def_delegatorsを使う

class User
  extend Forwardable
  def_delegators :info, :name, :age
end

同じ例をForwardabledef_delegatorsを使って書くとこんな感じになります。

Forwardable.def_delegatorを使う

class User
  extend Forwardable
  def_delegator :info, :name, :info_name
end

def_delegatorを使うとメソッド名をカスタマイズすることもできます。

この例ではinfo_nameinfo.nameを参照できるようにしています。

def_delegatorsと引数の扱いが違うので気をつけましょう。

クラスメソッドを委譲する

クラスメソッドを委譲する方法もいくつかあります。

class << selfを使う

class User
  class << self
    delegate :log, to: :instance
  end
end

class << selfdelegateを使って委譲します。

SingleForwardableを使う

class Logger
  extend SingleForwardable
  def_delegators :instance, :log
end

Forwardableの代わりにSingleForwardableを使えばクラスメソッドを委譲出来ます。

もちろんdef_delegatorsを使ってもOKです。

まとめ

ということでRubyで委譲をする方法をいくつかご紹介しました。