こんな感じの言及を幾度か見かけた記憶があるのですが、これって(少なくとも Smalltalk では)“メッセージはオブジェクトじゃない”と言いたかったのですよねぇ…。 いや、それだとメッセージという概念がそもそもない Eiffel で、おかしくなるか…。
文脈的には問題はない(メソッドオブジェクトをブロックみたいに渡して何かをすることはない)のでいいっちゃあ、いいんですが。
ちなみに、Smalltalk でもメソッドはオブジェクトです。任意のレシーバを指定して起動(言ってみれば、任意の引数で仮想関数じゃない関数みたいにコール)することもできます。しませんけど。
method |
'string' asFraction "=> error "
お遊びで、CompiledMethod に #value: を
value: arg ^ self valueWithReceiver: arg arguments: #()
みたいに定義しておけば、
(1 to: 3) collect: [: each | each] "=> #(1 2 3) " (1 to: 3) collect: Object >> #yourself "=> #(1 2 3) "
(1 to: 3) select: [: each | each odd] "=> #(1 3) " (1 to: 3) select: Number >> #odd "=> #(1 3) "
てなかんじで、イテレータに、ブロック代わりのメソッドを渡すことができるようにもなります。abee さんに殺されますが。w