循环使用符号比较散列和数组
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
进行调试,因为它会在打印之前将符号转换为字符串
我正在尝试将散列的键与数组的内容进行比较。如果匹配,我希望从哈希中删除该项目。
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
进行调试,因为它会在打印之前将符号转换为字符串