假设你有这个:
def wipeProduct(hash, nameToDelete)
hash.each do |i|
key = i[0]
productName = i[1].first
hash.delete(key) if productName==nameToDelete
end
end
我不确定在遍历哈希的键值对时从哈希中删除内容是否安全。我查看了 RI 文档,但我没有看到任何有关 Hash 的并发修改。
我知道你可以重写这个
def wipeProduct(hash, nameToDelete)
keysToDelete = []
hash.each do |i|
key = i[0]
productName = i[1].first
keysToDelete << key if productName==nameToDelete
end
keysToDelete.each {|key| hash.delete(key) }
end
甚至:
def wipeProduct(hash, nameToDelete)
hash.reject!{|key,value| nameToDelete==value.first}
end
但我想知道上面第一个例子中的并发修改是否有问题? (我运行代码的时候好像不是)
问题:有谁知道Hash并发修改的位置是什么? (...和其他集合?)- 如果您愿意,我当然想要任何指向记录此内容的资源的链接。
最佳答案
只要没有其他线程试图访问哈希,任何这些方法都可以。如果有任何其他线程可以访问此哈希,那么这些方法都不是明确的线程安全的。您需要让它们安全运行,只需确保您的方法在散列修改期间获得锁,一切都会顺利进行。
就我个人而言,我会选择破坏性的 reject_if!它是更简洁的代码,无需复制现有代码即可完成相同的事情。
关于ruby - 遍历 ruby Hash 时并发修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1684515/