LoginSignup
4
4

More than 5 years have passed since last update.

Ruby: Forwardable によるデリゲート(委譲)

Posted at

Ruby の標準添付ライブラリに Forwardable があります。
Forwardable によりデリゲート(委譲)が手軽に行えます。
本稿は Fowardable に関する簡単なメモです。

参考リンク

Forwardable

例1

簡単な委譲の例です。

sample1.rb
#!/usr/bin/env ruby

require 'forwardable'

class C
  extend Forwardable              # Forwardable を extend する

  delegate %i(push []) => :@array # push, [] メソッド呼び出しを @array に委譲する 

  def initialize
    @array = []      # 委譲先オブジェクト
  end
end

c = C.new
c.push 2015                        # push メソッド呼び出しは @array に委譲される
c.push 'happy new year'            #            〃

p c[0]    #=> 2015                 # [] メソッド呼び出しは @array に委譲される
p c[1]    #=> "happy new year"     #            〃

例2

標準添付ライブラリにログ機能を提供する Logger があります。

以下は、Logger オブジェクトに委譲する例です。

sample2.rb
require 'forwardable'
require 'logger'

class C
  extend Forwardable      # Forwardable を extend する
                          # fatal 〜 debug メソッドの呼び出しを logger に委譲する
  delegate %i(fatal error warn info debug) => :logger

  attr_accessor :logger   # 委譲先オブジェクト(のアクセサ)

  def foo
    warn "(警告) foo は呼び出さないでください"  # warn メソッド呼び出しは logger に委譲される
  end

  def bar
    error "(異常) bar は呼び出したらダメ!!"   # error メソッド呼び出しは logger に委譲される
  end
end

c = C.new
c.logger = Logger.new STDOUT    # 実際の委譲先オブジェクト
c.foo
c.bar

実行結果

$ ruby sample2.rb 
W, [2014-12-31T15:59:36.757060 #24309]  WARN -- : (警告) foo は呼び出さないでください
E, [2014-12-31T15:59:36.757153 #24309] ERROR -- : (異常) bar は呼び出したらダメ!!

おわりに

上で述べた以外にも Forwardable には機能があります。
詳しくは冒頭に記した参考リンクを参照してください。

本稿内容の動作確認は以下の環境で行っています。

  • Ruby 2.1.5 p273

以上です。

4
4
2

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
4
4