【问题标题】:Best way to check for nil and update hash value检查零和更新哈希值的最佳方法
【发布时间】:2014-05-15 16:09:23
【问题描述】:

我有一个哈希值,其中的值都是数组。我想在这个哈希中查找一个键。如果它存在,我想向数组添加一个值。如果它不存在(hash[key] 返回 nil),那么我需要创建数组并添加一个值。目前我有这个:

hash[key].push elem unless hash[key].nul?
hash[key] ||= [elem]

这涉及 3 次查找。我是 ruby​​ 新手,所以我确信有更好的方法来做到这一点。这是什么?

我最初的计划是为哈希 [ ] 设置默认值。然后我可以使用:

hash[key].push elem

不幸的是,如果键不存在,那只会更改默认值,不会添加新键。

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    在这种情况下,您需要创建如下哈希:

    hash = Hash.new { |h,k| h[k] = [] }
    

    上面是为了处理像你这样的情况而创建的。看new {|hash, key| block } → new_hash

    hash = Hash.new { |h,k| h[k] = [] }
    
    hash[:key1] << 1
    hash[:key2] << 2
    hash[:key1] << 3
    
    hash # => {:key1=>[1, 3], :key2=>[2]}
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      (hash[key] ||= []) << elem
      

      不过,Arup 的回答要好得多。

      【讨论】:

      • BS(你不介意昵称,我想),我正在回应你的一个短暂的评论,将你的方法与 @Arup 的方法进行比较。你的是传统的方法。我在一个上下文中对两者进行了基准测试,||= .. 明显更快。我个人更喜欢它的读取方式,因为哈希的创建有时与操作所在的位置相去甚远。另一方面,您可以在哈希可能具有nil 值的情况下使用Arup。我认为这是一个折腾。顺便说一句,如果您给出了 Arup 的答案,我希望他会给出您的答案。
      • @CarySwoveland 我同意你的看法。我一直很喜欢这个答案使用的语法。毫无疑问我喜欢这个。但每当我发现 Ruby API 有一些我想要的东西时,我就直接去找它。
      【解决方案3】:

      您应该使用默认值创建哈希。

      hash = Hash.new { |h,k| h[k] = [] }
      hash[key].push elem
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 2012-02-09
        • 2010-11-03
        • 2010-10-04
        • 2010-09-20
        相关资源
        最近更新 更多