循环使用符号比较散列和数组

Loop Using Symbols to Compare Hash to Array

我正在尝试将散列的键与数组的内容进行比较。如果匹配,我希望从哈希中删除该项目。

allocate = {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}

bad = [:item2, :item4] 

效果很好:

allocate.tap{ |h| h.delete(:item1)}
allocate
=> {:item2=>[1, 2], :item3=>[1, 3]}

如果我从 "bad" 数组中调用一个值,这些值将作为字符串而不是符号返回。

bad[1]
=> "item4" 

这也发生在循环中:

bad.each do |bad|
  allocate.tap{ |h| h.delete(bad)}
  puts bad
end

=> "item2"
=> "item4"

allocate
=> {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}

出于性能原因,我想将散列键和数组保留为符号。我需要做什么才能访问 "bad" 数组并将项目保留为符号,以便我可以将它与分配哈希进行正确比较?

我正在使用 Ruby v 2.1.3p242。

您可以使用 to_sym 将字符串翻译成符号。顺便说一句,不需要使用 tap:

bad.each { |key| allocate.delete(key.to_sym) }

或者:

allocate.delete_if { |key, _| bad.map(&:to_sym).include?(key) }
allocate = {:item1=>[1, 1], :item2=>[1, 2], :item3=>[1, 3]}   
bad = [:item2, :item4]

bad.each {|k| allocate.delete(k) }
allocate # => {:item1=>[1, 1], :item3=>[1, 3]}

"bad" 值是符号。使用 p 检查它们。

p bad[0] # prints => :item2
p bad[1] # prints => :item4

不要使用 puts 进行调试,因为它会在打印之前将符号转换为字符串