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
代码来自《红宝石编程语言》一书。但这让我很困惑:method(memoize) 如何将 lambda 作为它的方法应用?lambda 可以在其他 lambda 之后使用 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)
为什么?