我是 ruby 新手,正在学习编码。我想了解 Enumerable 中的一些方法如何可用模块工作。所以我正在重新实现它们。一个挑战是使用递归来实现它们。但是,我在尝试实现 Enumerable#Map 时遇到了问题使用递归的方法。
这是我的代码:
class Array
def mymap_recursive(&block)
copy_of_array = dup
new_array = []
return new_array if copy_of_array.empty?
value = copy_of_array.shift
new_array << yield(value)
copy_of_array.mymap_recursive(&block)
end
end
我想弄清楚为什么它不起作用,所以我放了
puts "#{new_array}"
在方法的最后。然后在 Sublime Text 中,我做了
arr = [2,2,5,5,10]
arr.mymap_recursive {|n| n * n}
按下cmd+b后,我得到的输出是:
[100]
[25]
[25]
[4]
[4]
我不明白为什么它不返回一个包含所有值的数组。
感谢您的帮助!
最佳答案
您的代码中发生的情况是,每次您调用 mymap_recursive(&block)
时,new_array
都会丢失。要解决这个问题,您必须有一种方法来维护正在递归构建的新数组。对代码的一个简单更改是在方法定义中包含 new_array = []
,然后每次都传递新数组。以下是我进行更改后的代码:
class Array
def mymap_recursive(new_array = [], &block)
copy_of_array = self.dup
return new_array if copy_of_array.empty?
value = copy_of_array.shift
new_array << yield(value)
copy_of_array.mymap_recursive(new_array, &block)
end
end
然后当你调用
arr = [2,2,5,5,10]
p arr.mymap_recursive {|n| n * n}
#returns
#[4, 4, 25, 25, 100]
如果您对此语法有任何疑问或任何问题,请告诉我,我会尽力解释!
关于ruby - 如何使用递归在 ruby 中重新实现 map 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066217/