2012-10-26 96 views
3

tap方法如何工作併發?我是否需要擔心,如果我做的:Ruby中的#tap方法危險嗎?

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

,在現在或將來,紅寶石會盡量同時做這些操作?你知道,#tap聽起來很危險。

是否保證#tap塊順序執行(當然,除非在塊內部有異常情況)?

回答

11

Tap不會同時執行塊,而是按順序執行。所以你不必擔心併發問題,因爲沒有併發問題。

這裏是tap來源:

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

所以你可以看到,首先它調用塊(yield),只有它返回原來的對象之後。目前沒有併發性。

+0

只是你知道我爲什麼要問,因爲我碰巧在我的[這個問題]答案中使用#tap(http://stackoverflow.com/questions/13093430/how-do-i-find-intersection-of -3陣列,而忽略 - 空陣列),並有一些噓聲,所以我想加倍確信我不會提出一個不好的答案。 –

+0

@BorisStitnicky好吧,我明白了。那麼讓我們假設你在這個答案中以非常規方式使用了「tap」。它最初的目的是在長方法調用鏈中對數據進行「監視」或「窺探」(點擊數據)。但除此之外,你的答案並沒有什麼內在的錯誤,但答案中的其他一些選擇更加緊湊和重要。即基本上儘量不要讓代碼混淆讀者,即使它工作:) – Casper

+0

謝謝。在'拒絕'之前我發現'delete'方法是我的錯,然後我用'tap'修補了返回值。 –

5

你沒有什麼可擔心的。

除非您做某些事情明確地使其平行(例如創建線程),否則Ruby執行將是連續的。

+0

這就是我想聽到的。 –