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
これはいいかも、と思ったら、
似たような感じのものが見つかった。こちらはブロックではなくメソッドを対象としたもの。