хэш массива дает неверный размер результатов - Ruby - PullRequest
0 голосов
/ 01 марта 2010

Я пытаюсь вставить список в хэш. Однако хеш [ключ] .size дает мне недопустимые результаты.

p = Hash.new
p = {"a" => ["b","e"]}
puts p["a"].size #prints 2 ----This is the Problem
p["a"] << ["d", "f"]
puts p["a"].size #prints 3
puts p["a"][1] #prints e
puts p["a"][2] #prints df

Как, добавление большего количества списков увеличивает размер только на один (что правильно). Есть ли способ правильно инициализировать хеш - не увеличивать размер до 2.

1 Ответ

5 голосов
/ 01 марта 2010

Отредактировано для добавления : Ваши комментарии указывают на то, что вы хотите, чтобы элемент 'a' был массивом массивов. Вот оно:

h = Hash.new
h = {"a" => [["b","e"]]}
p h                         # => {"a"=>[["b", "e"]]}
h["a"] << ["d", "f"]
p h                         # => {"a"=>[["b", "e"], ["d", "f"]]}

При диагностике проблемы предпочитайте p puts. puts может скрывать важные детали. Давайте добавим несколько звонков к p и посмотрим, что мы узнаем. О, и я поменяю имя хеша с "p" на "h". Иначе вокруг слишком много «р».

h = Hash.new

Приведенная выше строка не нужна. Следующая строка присваивает массив «h», перезаписывая это назначение.

h = {"a" => ["b","e"]}
p h    # => {"a"=>["b", "e"]}
p h["a"].size    # 2

Все именно так, как и должно быть, даже h ["a"]. Размер возвращается 2. почему?

p h["a"]    # => ["b", "e"]

Потому что h ["a"] - это массив с двумя элементами.

h["a"] << ["d", "f"]
p h    # => {"a"=>["b", "e", ["d", "f"]]}

Вы видите, что случилось? << добавляет один элемент в конец массива, и этот единственный элемент является массивом ["d", "f"]. И вот почему:

p h["a"].size    # => 3

Поскольку в массиве действительно есть три элемента: строки "b" и "e" и массив ["d", "f"].

Если вы хотели добавить элементы "d" и "f" в массив, то сделайте это с помощью +=:

h = {"a" => ["b","e"]}
h["a"] += ["d", "f"]
p h    # => {"a"=>["b", "e", "d", "f"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...