相关疑难解决方法(0)

使用哈希默认值时出现奇怪的,意外的行为(消失/更改值),例如Hash.new([])

考虑以下代码:

h = Hash.new(0)  # New hash pairs will by default have 0 as values
h[1] += 1  #=> {1=>1}
h[2] += 2  #=> {2=>2}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是:

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`?
Run Code Online (Sandbox Code Playgroud)

在这一点上,我希望哈希是:

{1=>[1], 2=>[2], 3=>[3]}
Run Code Online (Sandbox Code Playgroud)

但它远非如此.发生了什么,我怎样才能得到我期望的行为?

ruby hash

102
推荐指数
2
解决办法
2万
查看次数

通过基于项的属性对对象数组进行分组来构建哈希

我想知道在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"]} 
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它的输出是错误的(你可以看到):

 sh = Hash.new([])
 => {} 
> aers.each do |aer|
>     sh[aer.size] << …
Run Code Online (Sandbox Code Playgroud)

ruby arrays hash

18
推荐指数
1
解决办法
9164
查看次数

哈希默认值未被使用

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

一个使用默认值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 # …
Run Code Online (Sandbox Code Playgroud)

ruby hash default-value

2
推荐指数
1
解决办法
719
查看次数

如何用数组编组哈希?

我该怎么做来编组数组的哈希? 以下代码仅打印{}.

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
Run Code Online (Sandbox Code Playgroud)

如果散列不包含数组,则可以正确恢复.

ruby serialization

1
推荐指数
1
解决办法
2348
查看次数

Ruby - Hash不存储密钥

我在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>
Run Code Online (Sandbox Code Playgroud)

为什么一旦我"a"为哈希添加了密钥,它就不会出现在结果中Hash#keys

谢谢

ruby hash keyset

1
推荐指数
1
解决办法
560
查看次数

标签 统计

ruby ×5

hash ×4

arrays ×1

default-value ×1

keyset ×1

serialization ×1