考虑以下代码:
h = Hash.new(0)  # New hash pairs will by default have 0 as values
h[1] += 1  #=> {1=>1}
h[2] += 2  #=> {2=>2}
这一切都很好,但是:
h = Hash.new([])  # Empty array as default value
h[1] <<= 1  #=> {1=>[1]}                  ? Ok
h[2] <<= 2  #=> {1=>[1,2], 2=>[1,2]}      ? Why did `1` change?
h[3] << 3   #=> {1=>[1,2,3], 2=>[1,2,3]}  ? Where is `3`?
在这一点上,我希望哈希是:
{1=>[1], 2=>[2], 3=>[3]}
但它远非如此.发生了什么,我怎样才能得到我期望的行为?
我想知道在ruby 1.9中是否有更规范的方法可以做到这一点
我有一个包含大量对象的数组,我想使用数组中每个对象的属性将它们分组为Hash.
很简单的例子:
> sh = {}
 => {} 
> aers = %w(a b c d ab bc de abc)
 => ["a", "b", "c", "d", "ab", "bc", "de", "abc"] 
> aers.each do |aer|
>     sh[aer.size] = [] if sh[aer.size].nil?
>     sh[aer.size] << aer
>   end
=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"] 
> sh
 => {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]} 
我试过这个,但它的输出是错误的(你可以看到):
 sh = Hash.new([])
 => {} 
> aers.each do |aer|
>     sh[aer.size] << …今天我尝试了以下代码片段,我不明白为什么我们之间会得到不同的结果.据我所知,他们是一样的.
一个使用默认值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 # …我该怎么做来编组数组的哈希?
以下代码仅打印{}.
s = Hash.new
s.default = Array.new
s[0] << "Tigger"
s[7] << "Ruth"
s[7] << "Puuh"
data = Marshal.dump(s)
ls = Marshal.restore( data )
p ls
如果散列不包含数组,则可以正确恢复.
我在irb中执行了以下操作:
irb(main):068:0* map = Hash.new(Array.new)
=> {}
irb(main):069:0> map["a"]
=> []
irb(main):070:0> map["a"].push("hello")
=> ["hello"]
irb(main):071:0> map["a"].push(1)
=> ["hello", 1]
irb(main):072:0> map.has_key?("a")
=> false
irb(main):073:0> map.keys
=> []
irb(main):074:0>
为什么一旦我"a"为哈希添加了密钥,它就不会出现在结果中Hash#keys?
谢谢