我正在阅读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
在这个例子中是如何运作的。
答案 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
之前,之后和之后使用的任何其他效果。在这种情况下,即在其自己的线程中开始每个块评估。