2015-07-30 3 views
0

У меня есть хэш с 5 элементами, например:Рубин - Hash - Комбинация

my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 

Моя цель состоит в том, чтобы вернуться каждый раз в хэш петли, но без одного элемента, как:

my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc' } 

затем

my_hash = {a: 'qwe', b: 'zcx', c: 'dss', e: 'www' } 

и так далее

Использование массива Я бы использовал метод комбинации, но когда я использую хэш? Я хотел бы сделать это так же легко, как это возможно

ответ

4

Вы можете преобразовать его в массив и преобразовать его обратно в хэш позже:

my_hash.to_a.combination(4).to_a.sample.to_h 
# => {:a=>"qwe", :b=>"zcx", :c=>"dss", :e=>"www"} 
my_hash.to_a.combination(4).to_a.sample.to_h 
# => {:a=>"qwe", :c=>"dss", :d=>"ccc", :e=>"www"} 
+2

Yours лучше. Уточнение: 'my_hash.to_a.combination (4) .lazy.map (&: to_h) .each', чтобы получить цикл OP. – Amadan

+0

Почему вы хотите использовать ленивое перечисление для статических данных? – Glupo

+1

@Glupo: Что вы имеете в виду, статические данные? Цель - избежать создания массива хешей. С его помощью 'map' возвращает' Enumerator :: Lazy'; без него 'map' создает экземпляр' Array' того же размера, что и тот, который создается 'комбинацией'. – Amadan

Смежные вопросы