2012-05-08 2 views
1
 
h = {1=>[1,2,3], 2=>[4,5,6]} 
new_arr = [] 
h.each_value {|arr| 
    new_arr.concat(arr) 
} 

Это работает, но что более похоже на рубиновый способ?Соберите хэш массивов в рубине

Все значения являются массивами, но элементы каждого массива не должны быть изменены.

ответ

10

Как про это?

h.values.flatten 
+0

Определенно самое простое решение :) – d11wtq

+0

Вы можете использовать 'h.values.flatten (1)', если вы беспокоитесь, что можете сгладить что-то, чего вы не должны. –

4

Вы можете использовать уменьшить:

h.values.reduce(&:+) 
+0

Я не могу найти, где определен метод уменьшения. И что такое & синтаксис? – MxyL

+1

Enumerable - это модуль, в котором почти все перечислимые структуры данных (хэши, массивы, множества и т. Д.) Смешиваются в рубине. Вы должны изучить его больше, чем почти любую другую часть рубинового языка;) http://ruby-doc.org/core-1.9.3/Enumerable.html Синтаксис '&: +' - '&' (proc), за которым следует Символ ': +', который является способом указания вызова метода, вместо фактического прохождения блока. В этом случае '+' вызывается для каждого элемента массива 'values'. – d11wtq

+0

О, хорошо. Да, я видел перечислимый класс. – MxyL

0

Если вы хотите получить массив хэш-значений, используйте значения Hash #.

new_arr = h.values 
1

Слегка загадочно

h.flat_map(&:last) 

Слегка многословным

h.flat_map{|_, value| value} 
Смежные вопросы