猴子在Ruby中使用了一些更常用的方法,对它们进行修补以更好地理解每种方法是如何工作的(顺便说一句,这帮助了大量的工作)。
现在,我再次做同样的事情,但是对于我之前迭代过的部分,我使用的是递归。我的问题是:
我正在为#inject类创建自己的Array方法,我想递归地编写这个方法。该方法将允许传递一个可选累加器以及一个proc。如何使用以下格式完成此操作?
class Array
def my_inject(accum = nil, &prc)
#code
end
end另外,我是否需要担心原始数组的变异,我应该使用#dup吗?谢谢你提前帮忙!
发布于 2018-06-25 07:18:55
另一种实现
class Array
def aggregate(accumulator = nil, &sumator)
return accumulator if empty?
drop(1).aggregate(accumulator ? sumator.(accumulator, first) : first, &sumator)
end
end至于你是否应该担心变异原--简而言之--是的。通常,Ruby中的方法不会在可能的情况下修改对象并复制。通常情况下,会有do (!)替代品这样做。说“危险”的方法突变原地方,而不是返回一个副本。然而,在这种情况下,这是没有道理的。原始的是一个数组,结果是和。
至于变异原始结果和单独返回结果,除非您有真正的性能(或其他)考虑,您不应该这样做。这是不直观的,可能会导致混乱的情况。
发布于 2018-06-25 07:04:39
我想我明白了!
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 我唯一的问题是,这会不会有问题/它会使原始数组发生变异吗?
编辑:添加的版本,不变异原。
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 https://stackoverflow.com/questions/51017445
复制相似问题