Це має працювати:
array = [1,2,3,nil,4,5,nil,6,7,8,9]
array.inject([[]]) do |result, number|
number ? result.last << number : result << []
result
end
#=> [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
Час пояснення :-)
- inject починається з масиву, що містить порожній масив
- для кожного елемента він перевіряє, чи він не має значення
- , якщо це не так, він додає поточний номер до попереднього
масиву
- якщо це так, він створює новий пустий масив
- все це під час оновлення результату, який є масивом
масивів
-- EDIT --
Перевірка відповіді Давида Я перевірив реалізацію Rails
цього:
def split(value = nil)
using_block = block_given?
inject([[]]) do |results, element|
if (using_block && yield(element)) || (value == element)
results << []
else
results.last << element
end
results
end
end
Якщо ви пропустите реалізацію блоку, вона має точно таку ж
структуру мого коду. Так! :)