2013-12-14 2 views
1

나는 마츠의 책 "프로그래밍 루비"를 읽고있다, 그리고 9 장에서, 스레드에 대한 부분에서,이 코드 읽기 : 지도가이 문맥에서 어떻게 작동합니까?

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

내가 map 방법은 배열이나 컬렉션에 활동을 위해 사용되는 알고, 그리고 이 예에서는 self 또는 일부 object없이 표시합니다.

이 예제에서는 map이 어떻게 작동하는지 혼란 스럽습니다.

+0

당신은 메소드 앞부분에'self.'가 붙은 이런 유형의 구조체를 보았 기 때문에 혼란 스러울 수 있습니다. @mu가 설명했듯이, 루비는 수신기가 주어지지 않을 때 수신기가'self'라고 가정합니다. 그래서, 왜 필요하지 않을 때 (종종) '자기'를 보게 되는가? 친절한 설명은 작가가 문체상의 이유로 그것을 추가했다는 것입니다. 대부분의 사람들은 효과가없는 것을 추가하면 독자가 그 존재에 대한 이유를 생각하게하는 것을 피할 것이라는 데 동의 할 것이라고 생각합니다. 이 질문을하고 있다는 사실 자체가이 주장을지지 할 수 있습니다. –

+0

수신자가 없을 때'self'를 추가하는 것에 대해 알고 있었지만 Enumerable 메소드'map'은 나를 혼란 시켰고 앞의 예에서'self.each'로 보여주었습니다. 나는 '자기'를 사용하는 것이 더 명확하고 분명하게, 특히 초보자들에게 적합하다고 생각합니다. –

답변

2

mapEnumerable에 혼합 모든 클래스에 대해 정의된다 : 그 방법은 다소 동일하게된다.

object.concurrently { |x| # whatever }을 호출 할 때 Enumerable 개체에서 self이 호출되며 블록을 평가하기 위해 많은 수의 스레드를 생성한다는 점을 사용합니다.

또한 map을 책의 패턴으로 사용하면 yield 전후에 사용 된 추가 효과와 함께 Enumerable#map과 동일한 동작을 얻음을 의미합니다. 이 경우 자체 스레드에서 각 블록 평가가 시작됩니다.

5

명시 적 수신자없이 메소드를 호출하면 self에있는 메소드가 호출되므로 "self없이 표시됩니다"라고 표시된 경우 self이 기본 수신자로 암시 적으로 표시됩니다. 여기

def concurrently 
    self.map{|item| Thread.new{ yield item }}.each{|t| t.join} 
#^^^^^ This is implicit. 
end 
관련 문제