我正在用红宝石块和procs进行锻炼,现在我已经卡住了几个小时。在练习中,我首先必须创建一个将接收proc的my_each方法,并在不使用每种方法的情况下模仿每种方法的行为。然后,它将返回原始数组不变。然后,我们被要求创建一种方法,该方法通过使用已经创建的My_each方法来模拟MAP方法(不使用MAP)。在解决方案中,我们得到了下面的代码,我一直很难理解代码的机制。在阅读了不同的博客并观看了一些教程后,我想到了以下解释。您能看看我是否在正确的轨道上告诉我 - 这可以节省我很多小时!(以下是我们给出的解决方案)
def my_each(&prc)
i = 0
while i < self.count
prc.call(self[i])
i += 1
end
self
end
def my_map(&prc)
result = []
my_each { |el| result << prc.call(el) }
result
end
array_k.my_map
通过在array_k上调用my_map,我们隐含地在array_k上拨打my_each,通过{| el |结果&lt;&lt;my_each方法中的prc.call(el)}。在My_each方法中浏览循环时,我们在Array_K的每个elemenets上拨打proc(prc.call(self [i])),在我们的情况下,此proc是块{| el |结果&lt;&lt;prc.call(el)}。块ITESELF中的Prc.Call是指我们创建的A Proc,该proc将更改array_k的元素,并通过将更改的元素放入结果数组中创建新的元素。
我在正确的轨道上吗?
非常感谢!
我认为您的解释是正确的,并且您确实有正确的想法。
&proc
和 proc.call
语法很好,但是您可以使用yield
交替编写,例如:
def my_each
i = 0
while i < self.count
yield self[i]
i += 1
end
self
end
def my_map
result = []
my_each { |el| result << yield(el) }
result
end