【问题标题】:Hash default value not being used [duplicate]未使用哈希默认值[重复]
【发布时间】:2010-04-22 15:25:47
【问题描述】:

今天我尝试了以下 sn-ps 代码,但我不明白为什么它们之间会得到不同的结果。据我所知,它们是相同的。

一个使用默认值 off Hash,另一个 sn-p 在访问之前为密钥创建一个空数组。

任何了解发生了什么的人? :)

# 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

【问题讨论】:

  • 我刚才也有同样的问题:stackoverflow.com/questions/2552579/…
  • 我认为它们不一样。如果我像你一样用块尝试它,我看不到我用p a[:key] 输入的值。但是默认不是一个块,我确实得到了这个值,但是除非我调用特定的键,否则它不会显示。使用a.keysa.value 我得到一个空的Array 回来。似乎是一种将密钥添加到Hash 的方法,无论出于何种原因,这都很好。
  • 对不起,不完全一样。您已更改默认值(尝试在您的第一个示例中打印 a[:foo],您会看到)。我总是从一个空数组开始。顺便说一句,我也问过这个,似乎更相似:stackoverflow.com/questions/1822021/…

标签: ruby hash default-value


【解决方案1】:

也许这会有所帮助:

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

【讨论】:

    【解决方案2】:

    当您执行 a[:key] &lt;&lt; 2 时,您将空数组默认值滑出并添加 2(修改实际数组,而不是引用),而不会让哈希对象 a 知道您已更改任何内容。您修改了 a 作为默认值使用的对象,因此您也会看到:

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

    在第二个示例中,您创建了一个新数组,并使用b[:key]= 告诉b 它在该键下有一个值。

    如果你想要两全其美,试试这个:

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

    这将访问c[:key] 并使用+ 创建一个新数组并重新分配它。

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多