我正在尝试将哈希的键与数组的内容进行比较。如果匹配,我希望从哈希中删除该项。
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]}
出于性能原因,我想将哈希键和数组保留为符号。我需要做什么来访问“坏”数组并将项目保留为符号,以便我可以正确地将它与分配哈希进行比较?
我正在使用Ruby v 2.1.3p242。
答案 0 :(得分:2)
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]}
“坏”值是符号。使用p
进行检查。
p bad[0] # prints => :item2
p bad[1] # prints => :item4
不要使用puts
进行调试,因为它在打印前将符号转换为字符串
答案 1 :(得分:0)
您可以使用to_sym
将字符串翻译成符号。顺便说一下,没有必要使用tap
:
bad.each { |key| allocate.delete(key.to_sym) }
或者:
allocate.delete_if { |key, _| bad.map(&:to_sym).include?(key) }