From: matz@... (Yukihiro Matsumoto) Date: 1997-11-19T18:22:56+09:00 Subject: [ruby-dev:867] Re: [Req] Proc.new まつもと ゆきひろです In message "[ruby-dev:866] Re: [Req] Proc.new" on 97/11/19, Shin-ichiro HARA writes: |原です。 |Perl では(Perl、Perl とうるさいけど) &foo という関数があるとき、 |$bar = \&foo と簡単にとれて &$bar() として使えるわけですよね。こ |れを ruby ではどう書きますか?と「Perl ユーザのための FAQ」には |出てくるはずです。(ほんとか?)それに対して、実はメソッドはオブ |ジェクトにできて、 | |bar = Proc.new{ |*x| foo(*x) } |bar.call() | |と使うんだよ、と答えることになるでしょう。そこを | |bar = proc(:foo) |bar() | |と答えられたらかっこいいかなと思ったわけですよ。 まあ,その気持ちは分かるんですけど,Rubyのモデルではやっぱり メソッドはオブジェクトではないので,別のやり方の方が他との整 合性からも望ましいわけです.たぶん,これができるようになると こんどは「foo.barをオブジェクト化できる」という話が出て,泥 沼化してしまうのではないでしょうか? メソッドをオブジェクト 化するにしても別の方法を考えた方が良いと思います. |> |(2)foo() で、メソッド foo が定義されていない時 foo.call() |> |を呼び出してしまうのはどうでしょう? |> |> 構文的にはきれいですが,動作が複雑だなあ.どうしよう. | |メソッドもオブジェクトだったら面白いかなと思ったりした事あるけど、 |これだと「オブジェクトがメソッド」みたいで楽しいんじゃないかな。 ええ,記法の問題としては面白いと思います.だから悩むわけで. |> |(3)今見つけました。バグかも。 |> おそらくは1引数の時の挙動をイテレータよりも関数に合わ |> せたかったのではないかと推測します.この手当をしないと |> bar.call(1)でxが[1]になってしまいますから. | |あ、そうか。 | |> でも,foo.callは [] の方が嬉しいよなあ.これまたどうしよう. | |そうですよね。 おそらく foo = Proc.new { |*x| p x } foo.call() #=> [] foo.call(1) #=> [1] foo.call(2,3) #=> [2,3] bar = Proc.new { |x| p x } bar.call() #=> nil bar.call(25) #=> 25 bar.call(25, 26)#=> [25,26] baz = Proc.new { |x,y| p [x,y] } baz.call() #=>[nil,nil] baz.call(25) #=>[25,nil] baz.call(25, 26)#=>[25,26] となるのが望ましいと思うんですけど,どうでしょう? まつもと ゆきひろ /:|)