Повторять хеш для определенного диапазона - PullRequest
4 голосов
/ 29 сентября 2010

Как передать диапазон в хеш для итерации от индекса 1 до последнего?

h = {}

h[1..-1].each_pair do |key,value|
  puts "#{key} = #{value}
end

Этот код возвращает ошибку.Как я могу передать диапазон в хэш ??

РЕДАКТИРОВАТЬ:

Я хочу напечатать первый ключ и значение без каких-либо расчетов.

Из второго ключа и значения, которое я хочу сделатьнекоторые вычисления для моего хэша.

Для этого я написал этот код ... store_content_in_hash, содержащий ключ и значения.

first_key_value = store_content_in_hash.shift
f.puts first_key_value[1]
f.puts
store_content_in_hash.each_pair do |key,value|
  store_content_in_hash[key].sort.each {|v| f.puts v }
  f.puts
end

Любой лучший способ решить эту проблему ??

Ответы [ 4 ]

8 голосов
/ 29 сентября 2010

Только в Ruby 1.9:

С учетом хэша:

h = { :a => :b, :c => :d, :e => :f }

Перейти следующим образом:

Hash[Array(h)[1..-1]].each_pair do |key, value|
    # ...
end

Это будет повторять следующий хэш { :c => :d, :e => f }поскольку первая пара ключ / значение исключается из диапазона.

2 голосов
/ 29 сентября 2010

Хэши не имеют понятия порядка.В хэше нет такого понятия, как первый или второй элемент.

Так что вы не можете делать то, что хотите, с хешами.

0 голосов
/ 29 сентября 2010

Как уже отмечали другие, хэши не о порядке. Это правда, что 1.9 хэши упорядочены, но это просто удобство, а не их главная особенность.

Если порядок важен для вас, просто используйте массивы вместо хешей. В вашем случае массив пар (двухэлементные массивы), кажется, соответствует цели. И если вам нужен доступ к нему по ключу, вы всегда можете легко преобразовать его в хеш, используя метод Hash#[].

0 голосов
/ 29 сентября 2010

Хеш не о диапазонах. Речь идет о парах ключ-значение. В ruby ​​1.8 хэш неупорядочен, поэтому вы не можете быть уверены, в каком порядке будут перебираться ключи и значения, что делает «диапазон» устаревшим И я считаю, что вы делаете что-то не так (тм) в этой ситуации. Можете ли вы рассказать о своей проблеме?

С другой стороны, вы получаете сообщение об ошибке, поскольку квадратные скобки в экземпляре Hash принимают ключи. Поэтому, если ваш хэш не содержит 1..-1 в качестве ключа - вы получите значение nil, а nil не ответит на each_pair. Попробуйте это, чтобы овладеть этим:

h = {(1..-1) => {:foo => :bar}}

h[1..-1].each_pair do |key,value| 
  puts "#{key} = #{value}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...