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
end
def_delegator
を使うとメソッド名をカスタマイズすることもできます。
この例ではinfo_name
でinfo.name
を参照できるようにしています。
def_delegators
と引数の扱いが違うので気をつけましょう。
クラスメソッドを委譲する
クラスメソッドを委譲する方法もいくつかあります。
class << self
を使う
class User
class << self
delegate :log, to: :instance
end
end
class << self
とdelegate
を使って委譲します。
SingleForwardable
を使う
class Logger
extend SingleForwardable
def_delegators :instance, :log
end
Forwardable
の代わりにSingleForwardable
を使えばクラスメソッドを委譲出来ます。
もちろんdef_delegators
を使ってもOKです。
まとめ
ということでRubyで委譲をする方法をいくつかご紹介しました。