Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ブロック引数とinstance_evalメソッドを使ってインタフェイスをシンプルに保つ

FileとかSerialPortなんかで採用されてるインタフェイスは綺麗ですよね。
クラスを生成しなくともブロック呼べばスマートに開閉してくれます。
こういうものを実装するにはブロック引数とinstance_evalメソッドを使います。

コード

クラス本体

class Test
 def initialize
   @cmd = []
 end

 def handle(command)
   @cmd << command
 end

 def run
   @cmd.each {|i| puts i }
 end

 def self.run(&block)
   tst = Test.new
   tst.instance_eval(&block)
   tst.run
 end
end

実行用

Test.run do
  handle "first"
  handle "second"
end

結果

$ ruby selfblock.rb 
first
second

insetance_evalはinstance_eval()を使うとブロック内でメソッドを呼び出せる - Bye Bye Mooreのような使い方もできます。

参考もと

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック