Странное поведение от рубинового хэша - PullRequest
0 голосов
/ 22 июня 2011

Я получаю довольно неожиданное поведение от хэшей в ruby ​​

Вот упрощенная демонстрация проблемы

estdata = ["a","b","c"]
outputHash = Hash.new({:IDs => [], :count => 0})

estdata.each do |x|
  outputHash[x][:IDs] << x
  outputHash[x][:count] +=1
end

p outputHash # => {}
p outputHash["a"] # => {:count=>3, :IDs=>["a", "b", "c"]}

Итак, во-первых, почему первый p выводит пустой хеш, когдаясно, что outputHash не пустой?

И, во-вторых, и еще больше, к моему разочарованию и замешательству, почему кажется, что каждый ключ имеет указатель на одно значение (хеш, содержащий ключи: count и: IDs)) и как бы мне обойти это?

1 Ответ

5 голосов
/ 22 июня 2011

С Hash.new и параметром все будет указывать на один и тот же объект.

>> h = Hash.new('hello') #=> {}
>> h[:a] #=> "hello"
>> h[:a].object_id #=> 2152871580
>> h[:b].object_id #=> 2152871580
>> h[:c].object_id #=> 2152871580

То, что вы хотите, это блочная форма:

>> h = Hash.new { |h,k| h[k] = {} } #=> {}
>> h[:a].object_id #=> 2152698160
>> h[:b].object_id #=> 2152627480
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...