Rails 1.1 の Symbol#to_proc というアイデア


http://wota.jp/ac/?date=20060309#p01

遅レス。 経由で。 Ruby のブロック付きメソッド呼び出しメソッドで、ブロックの代わりにシンボル(ただし、& 修飾した…)を渡すことにより同様の効果を得るためのもの。ブロック付きメソッド呼び出し時に & 修飾した引数(ブロック以外…)を用いた場合に必ず呼ばれる to_proc メソッドを、シンボルに適切に定義することで多態させるというなかなかのアイデア


Smalltalk の場合、ブロック以外のオブジェクトをいわゆる“コレクションクロージャメソッド”の引数に使うことはあまり考えられていませんし、あっても Ruby と違い、ブロックとそのほかのオブジェクトを区別する必要がない(つまり、to_proc のようなしくみが必要ない)ため、まったく同じことするのは無理ですが、あえてこのアイデアを真似るとすれば、パラメータとして渡されたブロックを評価する際に起動される #value: を Symbol に定義することでしょうか。

Symbol >> value: anObject

   self numArgs > 0 ifTrue: [self error: 'no arguments required.'].
   ^ anObject perform: self
#(1 2 3) collect: #asString   " => #('1' '2' '3') "
#(1 2 3) select: #odd         " => #(1 3) "


以前ここで、メソッドオブジェクトを value: element で多態させる例(まあ、こちらは Ruby にはリファレンスにも載っている普通のことのようですが…)は書いたのですが、このとき、シンボルに多態させることを思いつかなかったことに、なぜかちょっぴり敗北感(?)をかんじてしまいます…。まだまだメッセージング・メタファの鍛錬が足りん!>自分


ところで、シンボルって何?…というかたは手前みそで恐縮ですが参考までにこちらをどうぞ。