From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-11-20T14:44:51+09:00 Subject: [ruby-dev:892] Re: [Req] Proc.new けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :00883 ] the message: "[ruby-dev:883] Re: [Req] Proc.new ", on Nov/20 13:13(JST) matz@netlab.co.jp (Yukihiro Matsumoto) writes: >まつもと ゆきひろです >|話しは戻りますが, どうしても関数をオブジェクト化して取り扱えないと行け >|ないんでしょうか? > >もとの話では「Perlが関数のリファレンスが使えるから」というこ >とでしたね.私の答えは「どうしてもしたかったら,前田さん風の >メソッドを自分で定義してね」というものにしようかなあ,と思っ >てます. ああ. そうでしたよね. でも, 私がそのFAQを書くなら次のようになりますね: rubyのイテレータに相当する機能がないから, perlやCでは関数のリファレン ス(ポインタ)を扱うことで代用しています(perlは文字列を渡す方法があるみ たいですが). ほとんどの場合, ある処理手続きを別の関数に渡したいときは, その処理手続 きをその場で書き下せる方が, 全然分かりやすい. array.sort{|x, y| x > y} と qsort(array, size_of_array, size_of_elm, comp_function); int comp_function(XX x, XX y) { x > y; } とでは前者の方が絶対に分かりやすいでしょ? って, こんな感じですか... そういったわけで, イテレータをその場で渡す方法は関数のリファレンスを渡 すよりも優れた方法だと思うのですが, その渡したいイテレータがただ別の関 数を呼ぶだけっていうことも結構あるんですよね... ですから, >前田さん風のメソッド: > > def function(name) > proc { |*args| send(name, *args) } > end > >Procの挙動を変えるのは実装上色々面倒なので避けたいです. 上記の関数と同じ動作を行なうような関数/メソッドが標準でrubyに用意され ていることは結構意味があることかなと思うんですが... procの時だけでなくイテレータとして呼ばれた時も何とか対処して欲しいです が... array.sort{|x, y| x > y} array.sort > array.sort {>} array.sort func(:>) みたいに関数のイテレータブロックが渡せる方法があるといいんですが... # ちょっと無理そうですねえ... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---