2012-02-07 53 views
2

我有像['a'=> false,'b' => false,'c' => false,......]的散列結構。 我的條件是:觀察者運行線程數組

  • 我使用多線程的每個元素和運行某些代碼段用於製造「假」爲true基於一定的條件。
  • 此循環將繼續,直到所有元素的值變爲「true」或某個「超時」。
  • 我想要一個應該在每個循環中收集這些鍵值的觀察者,這些值的值變爲'真',因爲我正在爲這些'真正'值元素運行另一個代碼。

但是,我寫的代碼沒有ruby-ism。感覺就像編寫Java代碼一樣。 請幫助我進行ruby-ism方法。

回答

0

下面是顯示從active_support提取的兩個哈希值之間差異的代碼。

# from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/diff.rb 
def hash_diff(h1, h2) 
    h1.dup.delete_if { |k, v| h2[k] == v }.merge!(h2.dup.delete_if { |k, v| h1.has_key?(k) }) 
end 

現在你這是你可以用它來檢測你的每個循環迭代之間的差異:

previous ||= my_hash 
diff = hash_diff(my_hash, previous) 
puts "Difference: #{diff.inspect}" unless diff.keys.empty? 
previous = my_hash 

請注意,您可能需要使用互斥這個代碼,以避免競爭條件和其他令人討厭錯誤。