def memoize
cache = {}
lambda { |*args|
unless cache.has_key?(args)
cache[args] = self[*args]
end
cache [args]
}
end
factorial = lambda {|x| return 1 if x== 0; x*factorial[x-1];}.memoize
puts factorial.call 10
コードは本「Ruby プログラミング言語」からのものです。しかし、それは私を混乱させます:メソッド(メモ化)をそのメソッドとしてラムダにどのように適用できますか? 独自のメソッドとして dot(.) を使用して、ラムダの後に他のラムダを続けることはできますか?
lambda {|x| return 1 if x== 0; x*factorial[x-1];}.memoize
ところで: 上記のコードは irb で動作しますが、Ruby インタープリターでは次のようなエラーが発生します。
memoize.rb:11: private method `memoize' called for #<Proc:0x0000000103bba018@memoize.rb:11> (NoMethodError)
なんで?