gpt4 book ai didi

ruby - lambda 的方法? Mats 的示例代码让我感到困惑。

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:13 25 4
gpt4 key购买 nike

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

代码来自《The ruby​​ programming language》一书。但这让我感到困惑:方法(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 和 lambda { ... } (或 -> { ... } 添加一个公共(public)的 memoize 方法较新的 Rubies)给你一个 Proc 实例。

现在开始memoize 本身。方法返回它们最后一个表达式的值,对于 memoize,最后一个表达式是这样的:

lambda { |*args| 
unless cache.has_key?(args)
cache[args] = self[*args]
end
cache [args]
}

所以 memoize 返回 Proc (self) 的包装器,它是 cache 的闭包,这个包装器所做的是:

  1. 检查 cache 是否有相关参数列表的条目(数组 args)。
  2. 如果我们没有缓存值,则计算原始 Proc 的值 (self[*args]) 并将其存储在缓存中。
  3. 返回缓存的值。

您可以使用 []执行 Proc 的方法,因此 proc.call(a, b)proc[a, b] 相同。

关于ruby - lambda 的方法? Mats 的示例代码让我感到困惑。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com