Ruby1.9のProc#call呼び出し
RubyのProcは処理を実行するために #call を呼ばないとだめなんだけど、JavaScriptやPythonみたく (args, ... ) で実行できた方が嬉しいとみんな思ってるはず。つまり
proc = lambda{|arg| do_something(arg)} proc.call('hello')
じゃなくて
proc = lambda{|arg| do_something(arg)} proc('hello')
こう書きたい。
で、思いだしたんだけど、Scalaは (args, ... ) をapplyメソッドの呼び出しと解釈するというルールでうまくいってるらしい。同じようにRubyでも変数に (args, ... ) がついてるときcallメソッドを呼ぶようにすればいい感じになるんじゃね?メソッドと変数は管理してるテーブルが違うから、パース時にどっちかわかるとか何かで読んだ気がするし・・・
よし、試しに作ってみよう、と思ってparse.yみてたら、なんと1.9にはそんな感じのがすでにありました。
| primary_value '.' paren_args { /*%%%*/ $$ = NEW_CALL($1, rb_intern("call"), $3); fixpos($$, $1); /*% $$ = dispatch3(call, $1, ripper_id2sym('.'), ripper_intern("call")); $$ = method_optarg($$, $3); %*/ }
proc = lambda{|msg| p "executed: #{msg}"} proc.('hello') # => executed: hello
.(args, ... ) でProcを実行できるんすね。なるほど。
もしかしてこれ常識だったりするんだろうか。
・・・
proc = ->(msg){p "executed: #{msg}"} proc.('hello')
って書いた方が1.9っぽい?