Ruby - хеш не хранит ключи - PullRequest
       39

Ruby - хеш не хранит ключи

1 голос
/ 16 апреля 2011

Я выполнил следующее в 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?

Спасибо

1 Ответ

5 голосов
/ 16 апреля 2011

Проблема

Вызывая

map["a"].push("hello")

, вы изменяете объект Hash по умолчанию.Фактически, после этого каждый возможный ключ доставит «привет», но ключ на самом деле не инициализирован.Хеш будет знать только свой объект по умолчанию, но вы не сказали ему «инициализировать» ключ.

ruby-1.9.2-head :002 > map["a"].push("Hello")
 => ["Hello"] 
ruby-1.9.2-head :003 > map["a"]
 => ["Hello"] 
ruby-1.9.2-head :004 > map["b"]
 => ["Hello"] 
ruby-1.9.2-head :004 > map.keys
 => [] 

Что вы можете сделать, это специально инициализировать ключ:

ruby-1.9.2-head :008 > map["a"] = Array.new
 => [] 
ruby-1.9.2-head :009 > map.keys
 => ["a"]

Но на самом деле это не то, что вам нужно.

Решение:

Такое поведение по умолчанию может быть достигнуто с помощью следующего метода для инициализации хэша:

map = Hash.new { |hash, key| hash[key] = Array.new }

Например:

ruby-1.9.2-head :010 > map = Hash.new { |hash, key| hash[key] = Array.new }
 => {} 
ruby-1.9.2-head :011 > map["a"]
 => [] 
ruby-1.9.2-head :012 > map["b"]
 => [] 
ruby-1.9.2-head :013 > map.keys
 => ["a", "b"] 

(я не специалист по Ruby, поэтому, если есть предложения, добавьте комментарий)

...