- 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编程语言”.
但它让我感到困惑:方法(memoize)如何应用于lambda作为其方法?
lambda后跟其他lambda用点(.)作为自己的方法吗?
- 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)
为什么?
解决方法
你在说什么:
- def memoize
- #...
- end
我想你的意思是这样说:
- class Proc
- def memoize
- #...
- end
- end
这将为Procs添加一个公共memoize方法,并且lambda {…}(或者在更新的Rubies中的 – > {…})会为你提供一个Proc实例.
现在要记住自己.方法返回它们的最后一个表达式的值,对于memoize,最后一个表达式是这样的:
- lambda { |*args|
- unless cache.has_key?(args)
- cache[args] = self[*args]
- end
- cache [args]
- }
所以memoize返回一个Proc(self)包装器,它是一个缓存闭包,所有这个包装器都是:
>检查缓存是否有相关参数列表的条目(Array args).
>如果我们没有缓存值,则计算原始Proc的值(self [* args])并将其存储在缓存中.
>返回缓存的值.