Возможно, вы могли бы сделать это с помощью стека, но рекурсивно проектировать его довольно просто:
#!/usr/bin/env ruby
x = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
def parse(list)
result = []
while list.any?
case (item = list.shift)
when :open
result.push(parse(list))
when :close
return result
else
result.push(item)
end
end
return result
end
puts parse(x).inspect
Обратите внимание, что это уничтожит ваш исходный массив. Вы должны clone
передать его, если хотите сохранить.