Saya hanya punya pertanyaan singkat tentang loop di Ruby. Apakah ada perbedaan antara dua cara iterasi melalui koleksi?
# way 1
@collection.each do |item|
# do whatever
end
# way 2
for item in @collection
# do whatever
end
Hanya ingin tahu apakah ini persis sama atau jika mungkin ada perbedaan yang halus (mungkin kapan @collection
nihil).
x
tetap ada dalam skenario for adalah karena fakta bahwa (secara umum) kata kunci tidak membuat cakupan baru. jika , kecuali , mulai , untuk , sementara , dll semua bekerja dengan ruang lingkup saat ini.#each
Namun menerima satu blok. Blok selalu menambahkan ruang lingkup mereka sendiri di atas ruang lingkup saat ini. Berarti mendeklarasikan variabel baru di blok (sehingga lingkup baru) tidak akan dapat diakses dari luar blok karena lingkup tambahan itu tidak tersedia di sana.Lihat " The Evils of the For Loop " untuk penjelasan yang baik (ada satu perbedaan kecil dalam mempertimbangkan pelingkupan variabel).
Menggunakan
each
ini dianggap lebih idiomatik penggunaan Ruby.sumber
Contoh pertama Anda,
lebih idiomatis . Meskipun Ruby mendukung konstruksi pengulangan seperti
for
danwhile
, sintaks blok umumnya lebih disukai.Perbedaan halus lainnya adalah bahwa variabel apa pun yang Anda nyatakan dalam satu
for
loop akan tersedia di luar loop, sedangkan yang di dalam blok iterator secara pribadi bersifat pribadi.sumber
while
danuntil
benar-benar memiliki beberapa kegunaan yang sangat konkret yang tidak dapat diganti dengan masing-masing seperti misalnya menghasilkan nilai unik atau untuk REPL.Satu lagi berbeda ..
sumber: http://paulphilippov.com/articles/enumerable-each-vs-for-loops-in-ruby
untuk lebih jelas: http://www.ruby-forum.com/topic/179264#784884
sumber
Sepertinya tidak ada perbedaan,
for
gunakan dieach
bawahnya.Seperti yang dikatakan Bayard, masing-masing lebih idiomatis. Itu menyembunyikan lebih banyak dari Anda dan tidak memerlukan fitur bahasa khusus. Komentar Per Telemakus
for .. in ..
mengatur iterator di luar lingkup loop, jadidaun
a
didefinisikan setelah loop selesai. Dimanaeach
tidak. Yang merupakan alasan lain yang mendukung penggunaaneach
, karena variabel temp tinggal periode yang lebih pendek.sumber
for
tidak digunakan dieach
bawahnya. Lihat jawaban lain.Tidak pernah menggunakannya
for
dapat menyebabkan bug yang hampir tidak bisa dilacak.Jangan tertipu, ini bukan tentang masalah kode gaya atau idiomatik. Implementasi Ruby
for
memiliki kelemahan serius dan tidak boleh digunakan.Berikut adalah contoh di mana
for
memperkenalkan bug,Cetakan
Menggunakan
%w{foo bar quz}.each { |n| ... }
cetakanMengapa?
Dalam satu
for
lingkaran variabeln
didefinisikan sekali dan hanya dan kemudian bahwa satu definisi digunakan untuk semua iterasi. Oleh karena itu setiap blok merujuk ke yang saman
yang memiliki nilaiquz
pada saat loop berakhir. Bug!Dalam satu
each
lingkaran variabel barun
didefinisikan untuk setiap iterasi, misalnya variabel di atasn
didefinisikan tiga kali terpisah. Oleh karena itu setiap blok merujuk pada yang terpisahn
dengan nilai yang benar.sumber
Sejauh yang saya tahu, menggunakan blok alih-alih struktur kontrol dalam bahasa lebih idiomatis.
sumber
Saya hanya ingin membuat poin spesifik tentang for in loop di Ruby. Ini mungkin tampak seperti sebuah konstruksi yang mirip dengan bahasa lain, tetapi sebenarnya itu adalah ekspresi seperti setiap konstruksi perulangan lainnya di Ruby. Bahkan, untuk dalam bekerja dengan objek Enumerable seperti setiap iterator.
Koleksi yang diteruskan ke dalam dapat berupa objek apa pun yang memiliki metode setiap iterator. Array dan hash mendefinisikan masing-masing metode, dan banyak objek Ruby lainnya juga. Loop for / in memanggil masing-masing metode objek yang ditentukan. Ketika iterator menghasilkan nilai, loop for memberikan setiap nilai (atau setiap set nilai) ke variabel yang ditentukan (atau variabel) dan kemudian mengeksekusi kode dalam tubuh.
Ini adalah contoh konyol, tetapi menggambarkan titik bahwa for in loop bekerja dengan objek APA PUN yang memiliki masing-masing metode, seperti halnya setiap iterator:
Dan sekarang setiap iterator:
Seperti yang Anda lihat, keduanya merespons setiap metode yang menghasilkan nilai kembali ke blok. Seperti yang dinyatakan oleh semua orang di sini, sudah pasti lebih baik menggunakan iterator masing-masing daripada untuk di dalam loop. Saya hanya ingin pulang ke titik bahwa tidak ada yang ajaib tentang untuk dalam lingkaran. Ini adalah ekspresi yang memanggil setiap metode koleksi dan kemudian meneruskannya ke blok kode. Oleh karena itu, ini adalah kasus yang sangat jarang Anda harus gunakan untuk masuk. Gunakan iterator masing-masing hampir selalu (dengan manfaat tambahan dari ruang lingkup blok).
sumber
Dalam loop 'untuk', variabel lokal masih hidup setelah setiap loop. Dalam loop 'setiap', variabel lokal me-refresh setelah setiap loop.
sumber