tap
方法如何工作併發?我是否需要擔心,如果我做的:Ruby中的#tap方法危險嗎?
some_object.tap { |o|
# time-consuming operation 1
}.tap { |o|
# time-consuming operation 2
}
,在現在或將來,紅寶石會盡量同時做這些操作?你知道,#tap
聽起來很危險。
是否保證#tap
塊順序執行(當然,除非在塊內部有異常情況)?
tap
方法如何工作併發?我是否需要擔心,如果我做的:Ruby中的#tap方法危險嗎?
some_object.tap { |o|
# time-consuming operation 1
}.tap { |o|
# time-consuming operation 2
}
,在現在或將來,紅寶石會盡量同時做這些操作?你知道,#tap
聽起來很危險。
是否保證#tap
塊順序執行(當然,除非在塊內部有異常情況)?
Tap不會同時執行塊,而是按順序執行。所以你不必擔心併發問題,因爲沒有併發問題。
這裏是tap
來源:
VALUE
rb_obj_tap(VALUE obj)
{
rb_yield(obj);
return obj;
}
所以你可以看到,首先它調用塊(yield
),只有它返回原來的對象之後。目前沒有併發性。
你沒有什麼可擔心的。
除非您做某些事情明確地使其平行(例如創建線程),否則Ruby執行將是連續的。
這就是我想聽到的。 –
只是你知道我爲什麼要問,因爲我碰巧在我的[這個問題]答案中使用#tap(http://stackoverflow.com/questions/13093430/how-do-i-find-intersection-of -3陣列,而忽略 - 空陣列),並有一些噓聲,所以我想加倍確信我不會提出一個不好的答案。 –
@BorisStitnicky好吧,我明白了。那麼讓我們假設你在這個答案中以非常規方式使用了「tap」。它最初的目的是在長方法調用鏈中對數據進行「監視」或「窺探」(點擊數據)。但除此之外,你的答案並沒有什麼內在的錯誤,但答案中的其他一些選擇更加緊湊和重要。即基本上儘量不要讓代碼混淆讀者,即使它工作:) – Casper
謝謝。在'拒絕'之前我發現'delete'方法是我的錯,然後我用'tap'修補了返回值。 –