rubyのメソッド引数の復習2

ブロックというか、Procオブジェクトというか、クロージャというか
そういうものを引数に取りたい場合は、


class Accum
def to_proc
sum = 0
Proc.new{|i| sum += i; p sum}
end
end
こんな感じのto_procメソッドの中でProcオブジェクトを返すようなメソッドを作って

おいて


irb(main):059:0> z = Accum.new
=> #
irb(main):060:0> [1, 3, 5, 7].each(&z)
1
4
9
16
=> [1, 3, 5, 7]
と、&をつけて呼ぶと評価される。
こう呼ぶこともできる

irb(main):060:0> [1, 3, 5, 7].each(&Accum.new)
1
4
9
16
=> [1, 3, 5, 7]
1行で書けるのは嬉しいが、&がついているため、コンストラクタではなく、to_proc

が呼ばれるので注意すること


番外:
これをJScriptWSHで書くとこういう感じになる。


// アキュムレータ作成用のクロージャ
function Accum()
{
var sum = 0;
return function(i){sum+=i;return sum};
}
// 標準出力へ出す(WSH依存な関数)
function Print(value)
{
WScript.Echo(value);
}
// イテレータ
function feach(f)
{
for(var i=0; i
JScriptだと配列だろうが、何だろうが
後づけで適当なオブジェクトに適当な関数を追加できるのが面白い。
こう書くと少しruby風にみえない?