Скорее синтаксическое любопытство, чем проблема, которую нужно решить ...
У меня есть два массива одинаковой длины, и я хочу перебрать их сразу - например, чтобы вывести оба их значения по определенному индексу.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Я знаю, что могу использовать each_index
и индексировать массивы следующим образом:
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
Есть ли способ сделать это лучше с помощью Ruby ? Что-то вроде этого?
# Obviously doesn't achieve what I want it to - but is there something like this?
[@budget, @actual].each do |budget, actual|
puts budget
puts actual
end
Ответы:
источник
Используйте
Array.zip
метод и передайте ему блок для последовательного перебора соответствующих элементов.источник
Есть еще один способ перебрать сразу два массива с помощью счетчиков:
Счетчики более эффективны, чем примеры, использованные выше, потому что они позволяют использовать бесконечные серии, параллельные итерации и другие методы.
источник
loop
показанного выше?В дополнение к тому,
a.zip(b).each{|x,y| }
что говорили другие, вы также можете сказать[a,b].transpose.each{|x,y| }
, что мне кажется немного более симметричным. Вероятно, не так быстро, поскольку вы создаете дополнительный[a,b]
массив.источник
transpose
заключается в том, что возникает исключение, если два массива не одинаковой длины.Связанный с исходным вопросом, для перебора массивов неравной длины, где вы хотите, чтобы значения циклически менялись, вы можете использовать
и Руби даст тебе
Это избавляет вас от
nil
значений, которые вы получите от простого использования zip.источник
Простое соединение двух массивов вместе хорошо работает, если вы имеете дело с массивами. Но что, если вы имеете дело с бесконечными счетчиками, например такими:
enum1.zip(enum2)
терпит неудачу, потому чтоzip
пытается оценить все элементы и объединить их. Вместо этого сделайте следующее:Это
lazy
спасает вас, делая результирующий перечислитель ленивой оценкой.источник
Как насчет компрометации и использования #each_with_index?
источник