プログラムを書いていると手続きを引数として渡したい場合が時々 ある.例えば,シグナルの処理などはそうだ.外側からあるシグナ ルが来た場合に対処するのに,その時に実行する手続きを指定でき れば良いだろう.
rubyではシグナルに対する処理を指定するのにはtrapというメソッ ドを使う.
ruby> trap "SIGUSR1", 'print "foobar\n"' nil ruby> Process.kill "SIGUSR1", $$ foobar 1
ここでは,シグナルが来た場合の手続きを文字列で指定している. rubyがインタプリタならでは手段である.しかし,いちいち文字列 を介さなくても,手続きをそのままオブジェクト化する方法もある.
ruby> trap "SIGUSR1", proc{print "foobar\n"} nil ruby> Process.kill "SIGUSR1", $$ foobar 1
procというのは{}で括られた部分を「手続きオブジェクト」と呼ぶ オブジェクトにするメソッドである.手続きを実行するためには callというメソッドを使う.
ruby> proc = proc{print "foo\n"} #<Proc:0x83c90> ruby> proc.call foo nil
手続きオブジェクトはハンドラやコールバックとしてCにおける関 数ポインタのように使える.いちいち関数やメソッドを定義する必 要が無い(名前も考えなくて良い)ので,手軽といえば手軽かも知れ ない.