【问题标题】:Loop Using Symbols to Compare Hash to Array循环使用符号比较散列和数组
【发布时间】:2015-07-28 19:34:49
【问题描述】:

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

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[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。

【问题讨论】:

  • “如果我从“坏”数组中调用一个值,这些值将作为字符串返回,而不是作为符号返回。” - 尝试仔细检查这个假设。这不应该是真的。使用puts [:item2, :item4][1] == :item4 尝试一个简单的 Ruby 程序
  • 您确定有问题吗? bad = [:item2, :item4] => [:item2, :item4]。然后bad[1] => :item4p bad[1] 打印:item4,但puts bad[1] 打印"item4"。你在哪里说bad[1] => "item4",确定不是puts bad[1]

标签: arrays ruby hash symbols


【解决方案1】:

您可以使用to_sym 将字符串转换为符号。顺便说一句,不需要使用tap

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

或者:

allocate.delete_if { |key, _| bad.map(&:to_sym).include?(key) }

【讨论】:

    【解决方案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 进行调试,因为它会在打印之前将符号转换为字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多