Ruby の標準添付ライブラリに Forwardable があります。
Forwardable によりデリゲート(委譲)が手軽に行えます。
本稿は Fowardable に関する簡単なメモです。
参考リンク
-
[標準添付ライブラリ紹介 【第 6 回】 委譲] (http://magazine.rubyist.net/?0012-BundledLibraries)
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
以上です。