代码之家  ›  专栏  ›  技术社区  ›  gaqzi

未使用哈希默认值[重复]

  •  2
  • gaqzi  · 技术社区  · 16 年前

    今天我尝试了下面的代码片段,我不明白为什么在它们之间得到不同的结果。据我所知他们是一样的。

    一个使用默认值off Hash 另一个代码段在访问键之前为它创建一个空数组。

    有人知道发生了什么吗?:)

    # Hash default if the key doesn't have a value set is an empty Array
    a = Hash.new([])
    a[:key] << 2 # => [2]
    p a # => {} nil
    p a[:key] # => [2]
    p a.keys # => []
    p a.values # => []
    
    # Explicitly add an array for all nodes before creating
    b = Hash.new
    b[:key] ||= []
    b[:key] << 2 # => [2]
    p b # => {:key=>[2]}
    p b.keys # => [:key]
    

    Ruby版本1.8.7

    2 回复  |  直到 16 年前
        1
  •  4
  •   mckeed    16 年前

    当你这么做的时候 a[:key] << 2 ,将空数组的默认值滑出并向其中添加2(修改实际数组,而不是引用),而不允许哈希对象 a 一

    p a[:wat] #=> [2]
    p a[:anything] #=> [2]
    

    在第二个示例中,您创建了一个新数组,并使用 b[:key]= 这说明 b

    如果您想两全其美,请尝试以下方法:

    c = Hash.new([])
    c[:key] += [2]
    

    这将访问 c[:key] 并用 +

        2
  •  5
  •   maček    16 年前

    也许这会有帮助:

    a = Hash.new { |hash, key| hash[key] = [] }
    a[:key] << 2 # => [2]
    a[:key]      # => [2]
    p a          # => {:key=>[2]}
    
    推荐文章