加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – lambda的方法? Mats的示例代码让我很困惑.

发布时间:2020-12-17 04:21:29 所属栏目:百科 来源:网络整理
导读:def memoize cache = {} lambda { |*args| unless cache.has_key?(args) cache[args] = self[*args] end cache [args] }endfactorial = lambda {|x| return 1 if x== 0; x*factorial[x-1];}.memoizeputs factorial.call 10 代码来自“ruby编程语言”. 但它让
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])并将其存储在缓存中.
>返回缓存的值.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读