Lebih dari keingintahuan sintaksis daripada masalah untuk dipecahkan ...
Saya memiliki dua array dengan panjang yang sama, dan ingin mengulangi keduanya sekaligus - misalnya, untuk menampilkan kedua nilai mereka pada indeks tertentu.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Saya tahu bahwa saya dapat menggunakan each_index
dan mengindeks ke dalam array seperti:
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
Apakah ada cara Ruby untuk melakukan ini lebih baik? Sesuatu seperti ini?
# 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
Jawaban:
sumber
Gunakan
Array.zip
metode ini dan berikan blok untuk beralih pada elemen yang sesuai secara berurutan.sumber
Ada cara lain untuk beralih dua array sekaligus menggunakan enumerator:
Pencacah lebih kuat daripada contoh yang digunakan di atas, karena mereka memungkinkan deret tak terbatas, iterasi paralel, di antara teknik lainnya.
sumber
loop
ditunjukkan di atas?Selain
a.zip(b).each{|x,y| }
seperti yang dikatakan orang lain, Anda juga bisa mengatakan[a,b].transpose.each{|x,y| }
, yang menurut saya sedikit lebih simetris. Namun, mungkin tidak secepat karena Anda membuat[a,b]
array ekstra .sumber
transpose
itu menimbulkan pengecualian jika kedua array tidak sama panjang.Terkait dengan pertanyaan awal, untuk mengulangi susunan dengan panjang yang tidak sama di mana Anda ingin nilai-nilai berputar di sekitar Anda dapat menggunakan
dan Ruby akan memberimu
Ini menyelamatkan Anda dari
nil
nilai - nilai yang akan Anda dapatkan dari hanya menggunakan zipsumber
Cukup dengan zip kedua array bekerja dengan baik jika Anda berurusan dengan array. Tetapi bagaimana jika Anda berhadapan dengan pencacah yang tidak pernah berakhir, seperti sesuatu seperti ini:
enum1.zip(enum2)
gagal karenazip
mencoba untuk mengevaluasi semua elemen dan menggabungkannya. Sebaliknya, lakukan ini:Yang itu
lazy
menyelamatkan Anda dengan membuat enumerator yang dihasilkan malas mengevaluasi.sumber
Bagaimana dengan berkompromi, dan menggunakan #each_with_index?
sumber