Rubyでのメソッドの委譲方法をまとめてみた
Rubyでは委譲の方法がいくつかあるのでまとめてみました。インスタンスメソッドの委譲方法とクラスメソッドの委譲方法をまとめています。チームで開発している場合はあらかじめ方法を統一しておくと良いと思います。
インスタンスメソッドを委譲する
まずはインスタンスメソッドを委譲する方法をいくつか紹介します。
delegateを使う
class User
delegate :name, :age, to: :info
endここではnameとageメソッドをinfoに委譲しています。
Forwardable.def_delegatorsを使う
class User
extend Forwardable
def_delegators :info, :name, :age
end同じ例をForwardableのdef_delegatorsを使って書くとこんな感じになります。
Forwardable.def_delegatorを使う
class User
extend Forwardable
def_delegator :info, :name, :info_name
enddef_delegatorを使うとメソッド名をカスタマイズすることもできます。
この例ではinfo_nameでinfo.nameを参照できるようにしています。
def_delegatorsと引数の扱いが違うので気をつけましょう。
クラスメソッドを委譲する
クラスメソッドを委譲する方法もいくつかあります。
class << selfを使う
class User
class << self
delegate :log, to: :instance
end
endclass << selfとdelegateを使って委譲します。
SingleForwardableを使う
class Logger
extend SingleForwardable
def_delegators :instance, :log
endForwardableの代わりにSingleForwardableを使えばクラスメソッドを委譲出来ます。
もちろんdef_delegatorsを使ってもOKです。
まとめ
ということでRubyで委譲をする方法をいくつかご紹介しました。