2004年10月22日

Ruby: 一回だけ実行されるブロック

警告メッセージを最初の一回だけ表示する、ということをしようと思い、次のようなコードを書いた。  
module Kernel
  @@once_executed = Hash.new
  def once
    location = caller.first
    # メッセージ表示だけなら値の保存は不要だが、せっかくなので一般化
    value = if @@once_executed.has_key?(location)
              @@once_executed[location]
            else
              @@once_executed[location] = yield
            end
    return value
  end
  module_function :once
end

def foo
  once { puts "hi" }
end

foo
foo
foo
% ruby test.rb
hi
once は最初の一回だけブロックを実行するメソッド。 次のようなコードをいちいち書くのを避けるために作った。
unless $displayed
  puts "hi"
  $displayed = true
end
これはいいかも、と思ったら、 似たような感じのものが見つかった。こちらはブロックではなくメソッドを対象としたもの。