地图如何在这种情况下工作?

时间:2013-12-14 19:16:19

标签: ruby multithreading enumerable

我正在阅读Matz的书“Programming Ruby”,在第9章,在关于Threads的部分,我读了这段代码:

module Enumerable
  def concurrently
    map{|item| Thread.new{ yield item }}.each{|t| t.join}
  end
end

我知道map方法用于包含数组或集合的操作,在此示例中,它显示的是没有self或某些object的内容。

我很困惑map在这个例子中是如何运作的。

2 个答案:

答案 0 :(得分:5)

调用没有显式接收器的方法会调用self上的方法,所以即使"它显示没有self" self隐式存在为默认接收者。该方法或多或少与:

相同
def concurrently
  self.map{|item| Thread.new{ yield item }}.each{|t| t.join}
 #^^^^^ This is implicit.
end

答案 1 :(得分:2)

此处map定义在Enumerable混合的任何类中。

当你调用self时,它将从任何Enumerable对象在object.concurrently { |x| # whatever }上调用,并且它的使用是它将产生大量线程来评估块。

此外,在本书的模式中使用map意味着您可以获得与Enumerable#map相同的行为,以及在yield之前,之后和之后使用的任何其他效果。在这种情况下,即在其自己的线程中开始每个块评估。