Saya ingin menggunakan for-each and a counter:
i=0
for blah in blahs
puts i.to_s + " " + blah
i+=1
end
Apakah ada cara yang lebih baik untuk melakukannya?
Catatan: Saya tidak tahu apakah blahs
itu array atau hash, tetapi harus melakukannya blahs[i]
tidak akan membuatnya lebih seksi. Saya juga ingin tahu cara menulis i++
di Ruby.
Secara teknis, jawaban Matt dan Squeegy berada di urutan pertama, tetapi saya memberikan jawaban terbaik untuk paradoja jadi sebarkan poin sedikit tentang SO. Juga jawabannya memiliki catatan tentang versi, yang masih relevan (selama Ubuntu 8.04 saya menggunakan Ruby 1.8.6).
Seharusnya menggunakan puts "#{i} #{blah}"
yang jauh lebih ringkas.
Jawaban:
Seperti yang orang katakan, Anda bisa menggunakan
tetapi jika Anda ingin indeks dengan iterator berbeda dengan "each" (misalnya, jika Anda ingin memetakan dengan indeks atau semacamnya), Anda dapat menggabungkan enumerator dengan metode each_with_index, atau cukup gunakan with_index:
blahs.each_with_index.map { |blah, index| something(blah, index)} blahs.map.with_index { |blah, index| something(blah, index) }
Ini adalah sesuatu yang dapat Anda lakukan dari ruby 1.8.7 dan 1.9.
sumber
[:a, :b, :c].each_with_index do |item, i| puts "index: #{i}, item: #{item}" end
Anda tidak dapat melakukan ini dengan untuk. Saya biasanya menyukai panggilan yang lebih deklaratif untuk masing-masing secara pribadi. Sebagian karena mudah untuk beralih ke bentuk lain saat Anda mencapai batas sintaks for.
sumber
Ya, itu
collection.each
untuk melakukan loop, dan kemudianeach_with_index
untuk mendapatkan indeks.Anda mungkin harus membaca buku Ruby karena ini adalah Ruby fundamental dan jika Anda tidak mengetahuinya, Anda akan mendapat masalah besar (coba: http://poignantguide.net/ruby/ ).
Diambil dari kode sumber Ruby:
hash = Hash.new %w(cat dog wombat).each_with_index {|item, index| hash[item] = index } hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1}
sumber
Jika Anda tidak memiliki versi baru
each_with_index
, Anda dapat menggunakanzip
metode untuk memasangkan indeks dengan elemen:blahs = %w{one two three four five} puts (1..blahs.length).zip(blahs).map{|pair|'%s %s' % pair}
yang menghasilkan:
1 one 2 two 3 three 4 four 5 five
sumber
'%s %s' % [1, "two"]
di dokumen Ruby? Terima kasih atas bantuan Anda dan telah menghemat ruang vertikal dengan menggunakan satu baris untuk pembuatan zipping dan pemetaan.Mengenai pertanyaan Anda tentang melakukan
i++
, Anda tidak dapat melakukannya di Ruby. Thei += 1
pernyataan Anda punya adalah persis bagaimana Anda seharusnya melakukannya.sumber
Seri enumerable enumerable cukup bagus.
sumber
Jika
blahs
kelas yang menggabungkan Enumerable, Anda harus dapat melakukan ini:blahs.each_with_index do |blah, i| puts("#{i} #{blah}") end
sumber
Jika Anda ingin mendapatkan indeks ruby untuk masing-masing, maka Anda dapat menggunakan
Berikut adalah contoh untuk menunjukkan cara
.each_with_index
kerjanya:range = ('a'..'z').to_a length = range.length - 1 range.each_with_index do |letter, index| print letter + " " if index == length puts "You are at last item" end end
Ini akan mencetak:
sumber