Posted at

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

More than 3 years have passed since last update.

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


以上です。