Вам лучше начать с этого:
a = [{ 1 => false, 2 => false, 3 => false, 4 => false }, { 5 => false }]
Тогда вы можете просто переворачивать логические значения по мере необходимости. В противном случае вам придется загрязнить ваш код кучей тестов, чтобы проверить, есть ли у вас Fixnum (1, 2, ...) или Hash ({1 => true}
), прежде чем вы сможете проверить значение флага.
Хэши в Ruby 1.9 упорядочены, поэтому вы не потеряете их, переключившись на хэши.
Вы можете преобразовать свой массив в эту форму одним из следующих способов:
a = a.map { |x| Hash[x.zip([false] * x.length)] }
# or
a = a.map { |x| x.each_with_object({}) { |i,h| h[i] = false } }
И если использование nil
в значении «не посещено» имеет больше смысла, чем начинать с false
, тогда:
a = a.map { |x| Hash[x.zip([nil] * x.length)] }
# or
a = a.map { |x| x.each_with_object({}) { |i,h| h[i] = nil } }
Некоторые полезные ссылки: