作者: Yukihiro Matsumoto
日時: 2004/3/14(00:52)
まつもと ゆきひろです

In message "[TSruby:135] 比較は「上下」ではなく「違い」のため"
    on 04/03/13, 機械伯爵 <kikwai@...> writes:

| これは純粋に質問ですが、Ruby普通の関数は確かオブジェクトでないので、ブロックを作る、といった記述があったかと思います。
|
| Pythonではdefで作ろうがlambdaで作ろうが関数はオブジェクトなのですが、Rubyではオブジェクト型の関数(メソッド?)とそうでない関数(メソッド)があるのはどういうわけでしょう?

メソッドもブロックもオブジェクト化できます。が、Pythonのよう
に

  obj.meth(a,b,c)

に対して、objのmethアトリビュートであるメソッドオブジェクト
を取り出して、それを引数(a,b,c)とともに実行する、という意味
づけを与えていないだけです。

Rubyでは

  obj.meth(a,b,c)

はobjのmethメソッドの呼び出しであり、それ以上でもそれ以下で
もありません。メソッド呼び出しのような基本的な処理にメソッド
オブジェクトを陽に取り出す意味が見いだせなかったからです。

しかし、メソッドをオブジェクトとして操作したければ、それはで
きます。が、めったにしないことなので

  obj.method(:meth)

のような形で取り出します。

| 特にLispも気に入っておられると書かれていたように記憶していますので、関数は一括オブジェクトとして扱ってもおかしくないと思うのですが・・・

伝統的にLispでは関数呼び出しは関数オブジェクトを経由しません。
Schemeでは統一されていますが。
古典的Lisp(たとえばCommonLisp)では

  (cons 1 2)

のように関数を呼び出すからといってシンボルconsが関数オブジェ
クトを指すわけではありません。ましてやメソッド呼び出しで直接
メソッドオブジェクトを見せるなんてことはしません。取り出そう
と思えば取り出せますが。

                        まつもと ゆきひろ /:|)