2012-10-26 5 views
3

tap 메서드는 어떻게 동시성으로 작동합니까? 내가한다면 다음과 같은 두려움이 있습니까 :Ruby의 #tap 메소드가 위험합니까?

some_object.tap { |o| 
    # time-consuming operation 1 
}.tap { |o| 
    # time-consuming operation 2 
} 

현재 또는 미래에 Ruby는 이러한 작업을 동시에 수행하려고합니까? #tap는 위험한 소리입니다.

#tap 블록이 순차적으로 실행된다는 보장이 있습니까 (물론 블록 내에서 이상한 일이 발생하지 않는 한)?

답변

11

Tap은 동시에 블록을 실행하지 않지만 순서대로 실행합니다. 따라서 동시성 문제가 없기 때문에 동시성 문제에 대해 걱정할 필요가 없습니다.

VALUE 
rb_obj_tap(VALUE obj) 
{ 
    rb_yield(obj); 
    return obj; 
} 

그래서 당신이 먼저가 블록 (yield)를 호출 볼 수 있으며 후에 만 ​​원래 객체를 반환 :

여기 tap의 소스입니다. 동시성은 없습니다.

+0

그냥 [왜이 질문에 대한 답변]에서 #tap을 사용했기 때문에 내가 묻는 이유를 알고 있습니다. (http://stackoverflow.com/questions/13093430/how-do-i-find-intersection-of -3 array-while-ignoring-empty-arrays), 그리고 그것에 대해 약간의 부글 끓기가 있었기 때문에 나는 나쁜 대답을 제시하지 않을 것이라는 것을 이중으로 확인하고 싶었다. –

+0

@BorisStitnicky 알았어. 글쎄, 당신이 그 대답에 틀에 얽매이지 않는 방식으로'탭 '을 사용했다고 가정 해 봅시다. 원래의 목적은 긴 메소드 호출 체인에서 데이터를 "모니터"하거나 "스파이"하는 것이 었습니다 (데이터를 활용). 그러나 그 외에는 본질적으로 당신의 대답에 잘못된 것이 없었습니다. 그러나 답안의 다른 대안들 중 일부는 더 작고 요점이었습니다. 나는. 기본적으로 독자가 너무 많은 코드를 작성할 때 혼동하지 않도록 노력하십시오 : – Casper

+0

고마워요. 'reject' 메소드가'reject' 전에 내 마음에 떠오른 후'return '값으로'tap'을 사용하여 패치 한 것입니다. –

5

걱정할 필요가 없습니다.

루비 실행은 명시 적으로 병렬 처리 (예 : 스레드 생성)를하지 않는 한 순차적입니다.

+0

내가 듣고 싶었던 것입니다. –