lba*_*aby 7 ruby methods lambda
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
Run Code Online (Sandbox Code Playgroud)
代码来自"红宝石编程语言".但它让我感到困惑:方法(memoize)如何应用于lambda作为其方法?lambda跟随其他lambda用点(.)作为自己的方法吗?
lambda {|x| return 1 if x== 0; x*factorial[x-1];}.memoize
Run Code Online (Sandbox Code Playgroud)
顺便说一句:上面的代码在irb中工作,但ruby解释器遇到如下错误:
memoize.rb:11: private method `memoize' called for #<Proc:0x0000000103bba018@memoize.rb:11> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
为什么?
你在说什么:
def memoize
#...
end
Run Code Online (Sandbox Code Playgroud)
我想你的意思是这样说:
class Proc
def memoize
#...
end
end
Run Code Online (Sandbox Code Playgroud)
这会memoize为Procs 添加一个公共方法,并且lambda { ... }(或者-> { ... }在更新的Rubies中)为你提供一个Proc实例.
现在就到了memoize.方法返回它们的最后一个表达式的值,对于memoize,最后一个表达式是这样的:
lambda { |*args|
unless cache.has_key?(args)
cache[args] = self[*args]
end
cache [args]
}
Run Code Online (Sandbox Code Playgroud)
因此memoize返回Proc(self)的包装器,它是一个闭包cache,所有这个包装器都是:
cache有相关参数列表的条目(数组args).self[*args])并将其存储在缓存中.您可以使用该[]方法执行Proc,因此proc.call(a, b)也是如此proc[a, b].