LoginSignup
8
7

More than 5 years have passed since last update.

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

Posted at

※ この記事は江の島エンジニアBlogの「Rubyでのメソッドの委譲方法をまとめてみた」の転載です。

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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7