У меня есть это:
hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
и я хочу добраться до этого: [["a","b","c"],["b","c"]]
Кажется, это должно работать, но это не так:
hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
Какие-либо предложения?
hash.values
это лучший ИМО). Но я хотел отметить, что когда вы предоставляете блок,Hash#each
он просто возвращает полное значение хэша. Если вы хотите выполнить операцию с каждым элементом и вернуть его в виде массива, используйтеHash#collect
или его псевдонимHash#map
. Подробнее о Enumerables здесь .Ответы:
Также немного попроще ....
Рубиновый документ здесь
источник
map
), потому что мне это очень нравится!Hash#values
не только проще, но и эффективнее. Сравнитьtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'
сtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
Я хотел бы использовать:
источник
Hash#values
.Enumerable#collect
принимает блок и возвращает массив результатов однократного выполнения блока для каждого элемента перечисляемого. Таким образом, этот код просто игнорирует ключи и возвращает массив всех значений.Enumerable
Модуль является довольно удивительным. Хорошее знание этого может сэкономить много времени и кода.источник
hash.values
здесь в конечном итоге правильный ответ.hash.map(&:second)
:)источник
Это так просто, как
это вернет новый массив, заполненный значениями из хэша
если вы хотите сохранить этот новый массив, сделайте
источник
Еще есть такой:
Почему это работает:
&
Вызовыto_proc
на объект, и передает его в качестве блока к методу.источник