在不使用每个方法和映射的情况下模拟每个方法和映射方法.对所需代码机制的说明



我正在用红宝石块和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的元素,并通过将更改的元素放入结果数组中创建新的元素。

我在正确的轨道上吗?

非常感谢!

我认为您的解释是正确的,并且您确实有正确的想法。

&procproc.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

相关内容

最新更新