2015-05-22 7 views
4

Я хочу построить массив из нескольких диапазонов. Следующие работы:создание массива из нескольких диапазонов

array_of_ranges = (70..89).to_a + (184..193).to_a + (224..233).to_a + (296..304).to_a + (336..345).to_a 
=> [70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 296, 297, 298, 299, 300, 301, 302, 303, 304, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345] 

, и это, конечно, гораздо лучше, чем вводить в кучу цифр - но я подозреваю, что это лучше, чище способ сделать это. Есть идеи?

ответ

9

Вы можете использовать оператор пейнтбольный сделать это довольно чисто:

[*70..89, *184..193, *224..233, *296..304, *336..345] 

Результат:

[70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 296, 297, 298, 299, 300, 301, 302, 303, 304, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345] 
1
def arrays_from *ranges 
    ranges.map do |r| 
    r.to_a 
    end.flatten 
end 

или

def arrays_from *ranges 
    ranges.map(&:to_a).flatten 
end 

arrays_from 70..89, 184..193, 224..233 
=> [70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233] 
+2

Это, безусловно, правильный подход, если вы хотите делать это программно (например, у вас есть массив диапазонов, хранящихся в переменной уже, и вы хотите преобразовать их в один непрерывный массив). Вы можете сделать это намного короче: 'range.flat_map (&: to_a)' – Ajedi32

+0

OK. Я не знал о 'flat_map'. Благодарю. –

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