サンプルコード。


class Cn
 
  def initialize(core)
    @core = core
    @actions = {}
  end
 
  # 遅延実行用にブロックを渡す
  def add(name, &block)
    @actions[name] = block
    return self
  end
 
  def doit()
    @actions.each{|name,block|
      # ここでブロックを実行する
      puts "#{@core} - #{name}: #{block.call(@core)}"
    }
  end
 
  # インターフェイスをシンプルにするためのクラスメソッド
  def self.doit(core, &block)
    cn = Cn.new(core)
    cn.instance_eval(&block)
    cn.doit
  end
 
end
 
# ブロック内が遅延実行される
cn1 = Cn.new('hoge1')
cn1.add('foo') { "#{Time.now}" }
cn1.add('bar') { |arg| "#{arg}" }
puts Time.now
sleep 3
cn1.doit
 
# インターフェイスをシンプルにするブロック
Cn.doit('hoge2'){
  add('foo') { "#{Time.now}" }
  add('bar') { |arg| "#{arg}" }
  puts Time.now
  sleep 3
}

実行結果。


C:\>ruby r2.rb
2011-05-05 08:55:57 +0900
hoge1 - foo: 2011-05-05 08:56:00 +0900
hoge1 - bar: hoge1
2011-05-05 08:56:00 +0900
hoge2 - foo: 2011-05-05 08:56:03 +0900
hoge2 - bar: hoge2

ちなみに、環境。


C:\>uname -mrsv
WindowsNT 1 5 x86
 
C:\>ruby -v
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]

tags: ruby

Posted by NI-Lab. (@nilab)