首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用递归重写Ruby #inject (# recursion )?

使用递归重写Ruby #inject (# recursion )?
EN

Stack Overflow用户
提问于 2018-06-25 06:27:12
回答 2查看 563关注 0票数 2

猴子在Ruby中使用了一些更常用的方法,对它们进行修补以更好地理解每种方法是如何工作的(顺便说一句,这帮助了大量的工作)。

现在,我再次做同样的事情,但是对于我之前迭代过的部分,我使用的是递归。我的问题是:

我正在为#inject类创建自己的Array方法,我想递归地编写这个方法。该方法将允许传递一个可选累加器以及一个proc。如何使用以下格式完成此操作?

代码语言:javascript
运行
复制
class Array
  def my_inject(accum = nil, &prc)
    #code
  end 
end

另外,我是否需要担心原始数组的变异,我应该使用#dup吗?谢谢你提前帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-25 07:18:55

另一种实现

代码语言:javascript
运行
复制
class Array
  def aggregate(accumulator = nil, &sumator)
    return accumulator if empty?

    drop(1).aggregate(accumulator ? sumator.(accumulator, first) : first, &sumator)
  end
end

至于你是否应该担心变异原--简而言之--是的。通常,Ruby中的方法不会在可能的情况下修改对象并复制。通常情况下,会有do (!)替代品这样做。说“危险”的方法突变原地方,而不是返回一个副本。然而,在这种情况下,这是没有道理的。原始的是一个数组,结果是和。

至于变异原始结果和单独返回结果,除非您有真正的性能(或其他)考虑,您不应该这样做。这是不直观的,可能会导致混乱的情况。

票数 4
EN

Stack Overflow用户

发布于 2018-06-25 07:04:39

我想我明白了!

代码语言:javascript
运行
复制
class Array
  def my_inject(acc=nil, &prc)  
    return acc if empty?    
    acc = self.shift if acc.nil? 

    acc = prc.call(acc, self.first)    
    self.shift    
    my_inject(acc, &prc)    
  end    
end  

我唯一的问题是,这会不会有问题/它会使原始数组发生变异吗?

编辑:添加的版本,不变异原。

代码语言:javascript
运行
复制
class Array
  def my_inject(acc=nil, &prc)  
    new_arr = self.dup
    return acc if empty?    
    acc = new_arr.shift if acc.nil? 

    acc = prc.call(acc, self.first)    
    new_arr.shift    
    my_inject(acc, &prc)    
  end    
end  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51017445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档