江の島エンジニアBlog
tips

Rubyでのメソッドの委譲方法をまとめてみた

Rubyでは委譲の方法がいくつかあるのでまとめてみました。インスタンスメソッドの委譲方法とクラスメソッドの委譲方法をまとめています。チームで開発している場合はあらかじめ方法を統一しておくと良いと思います。 (2015/03/26)

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で委譲をする方法をいくつかご紹介しました。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly