Отдельные элементы списка по их классу или kind_of в ruby - PullRequest
1 голос
/ 28 января 2012

У меня есть два списка:

a = [1,2,3]
b = ["a","b","c"]

мой список l это:

l = [a,b].flatten 

так что l = [1,2,3,"a","b","c"]

Я ищу элегантныйспособ разбить список по типу элементов в нем, чтобы восстановить a и b, как они были.

Я мог бы пойти с каждым элементом в списке и проверить, но этоне кажется эффективным ни во время выполнения, ни в коде.

1 Ответ

6 голосов
/ 28 января 2012

Вы можете использовать group_by, а затем извлечь свои массивы из полученного хэша:

>> by_class = l.group_by(&:class)
=> {Integer=>[1, 2, 3], String=>["a", "b", "c"]}
>> a = by_class[Fixnum]
=> [1, 2, 3]
>> b = by_class[String]
=> ["a", "b", "c"]

Если вы знаете, что у вас есть только Fixnums и Strings, вы можете использовать partition:

>> a, b = *l.partition { |o| o.is_a? Fixnum }
=> [[1, 2, 3], ["a", "b", "c"]]
>> a
=> [1, 2, 3]
>> b
=> ["a", "b", "c"]
...