PHP, untuk semua kutilnya, cukup bagus dalam hal ini. Tidak ada perbedaan antara array dan hash (mungkin saya naif, tapi ini tampaknya benar bagi saya), dan untuk beralih melalui Anda hanya melakukan
foreach (array/hash as $key => $value)
Di Ruby ada banyak cara untuk melakukan hal semacam ini:
array.length.times do |i|
end
array.each
array.each_index
for i in array
Hash lebih masuk akal, karena saya selalu menggunakan
hash.each do |key, value|
Mengapa saya tidak bisa melakukan ini untuk array? Jika saya ingin mengingat hanya satu metode, saya rasa saya bisa menggunakan each_index
(karena itu membuat indeks dan nilai tersedia), tapi itu menjengkelkan harus dilakukan, array[index]
bukan hanya value
.
Oh benar, saya lupa array.each_with_index
. Namun, yang satu ini menyebalkan karena ia pergi |value, key|
dan hash.each
pergi |key, value|
! Apakah ini tidak gila?
array#each_with_index
menggunakan|value, key|
karena nama metode menyiratkan urutan, sedangkan urutan yang digunakan untukhash#each
meniruhash[key] = value
sintaks?Jawaban:
Ini akan beralih melalui semua elemen:
Cetakan:
Ini akan mengulangi semua elemen yang memberi Anda nilai dan indeks:
Cetakan:
Saya tidak yakin dari pertanyaan Anda yang mana yang Anda cari.
sumber
Saya pikir tidak ada cara yang benar . Ada banyak cara berbeda untuk beralih, dan masing-masing memiliki ceruk tersendiri.
each
cukup untuk banyak penggunaan, karena saya tidak sering peduli dengan indeks.each_ with _index
bertindak seperti masing-masing Hash # - Anda mendapatkan nilai dan indeks.each_index
- hanya indeks. Saya tidak sering menggunakan ini. Setara dengan "length.times".map
adalah cara lain untuk beralih, berguna saat Anda ingin mengubah satu array menjadi yang lain.select
adalah iterator untuk digunakan ketika Anda ingin memilih subset.inject
berguna untuk menghasilkan jumlah atau produk, atau mengumpulkan hasil tunggal.Mungkin sepertinya banyak yang harus diingat, tetapi jangan khawatir, Anda bisa bertahan tanpa mengetahui semuanya. Tetapi ketika Anda mulai belajar dan menggunakan metode yang berbeda, kode Anda akan menjadi lebih bersih dan lebih jelas, dan Anda akan menuju penguasaan Ruby.
sumber
Saya tidak mengatakan bahwa
Array
->|value,index|
danHash
->|key,value|
tidak gila (lihat komentar Horace Loeb), tetapi saya mengatakan bahwa ada cara yang waras untuk mengharapkan pengaturan ini.Ketika saya berurusan dengan array, saya fokus pada elemen-elemen dalam array (bukan indeks karena indeks bersifat sementara). Metode ini masing-masing dengan indeks, yaitu setiap indeks +, atau | masing-masing, indeks |, atau
|value,index|
. Ini juga konsisten dengan indeks yang dilihat sebagai argumen opsional, misalnya | nilai | setara dengan | nilai, indeks = nihil | yang konsisten dengan | nilai, indeks |.Ketika saya berurusan dengan hash, saya sering lebih fokus pada kunci daripada nilai, dan saya biasanya berurusan dengan kunci dan nilai dalam urutan itu, baik
key => value
atauhash[key] = value
.Jika Anda ingin mengetik bebek, maka baik secara eksplisit menggunakan metode yang ditentukan seperti yang ditunjukkan Brent Longborough, atau metode implisit seperti yang ditunjukkan maxhawkins.
Ruby adalah tentang mengakomodasi bahasa yang sesuai dengan programmer, bukan tentang mengakomodasi programmer yang sesuai dengan bahasa. Inilah mengapa ada banyak cara. Ada begitu banyak cara untuk memikirkan sesuatu. Di Ruby, Anda memilih yang terdekat dan sisa kode biasanya keluar dengan sangat rapi dan ringkas.
Adapun pertanyaan awal, "Apa cara" benar "untuk beralih melalui array di Ruby?", Well, saya pikir cara inti (yaitu tanpa gula sintaksis yang kuat atau daya berorientasi objek) adalah untuk melakukan:
Tapi Ruby adalah tentang gula sintaksis yang kuat dan kekuatan berorientasi objek, tapi bagaimanapun, ini setara dengan hash, dan kunci dapat dipesan atau tidak:
Jadi, jawaban saya adalah, "Cara" benar "untuk beralih melalui array di Ruby tergantung pada Anda (yaitu programmer atau tim pemrograman) dan proyek.". Programmer Ruby yang lebih baik membuat pilihan yang lebih baik (yang kekuatan sintaksis dan / atau pendekatan berorientasi objek). Programmer Ruby yang lebih baik terus mencari lebih banyak cara.
Sekarang, saya ingin mengajukan pertanyaan lain, "Apa cara" benar "untuk beralih melalui Range di Ruby ke belakang?"! (Pertanyaan ini adalah bagaimana saya sampai di halaman ini.)
Sangat menyenangkan untuk melakukan (untuk ke depan):
tapi saya tidak suka melakukan (untuk mundur):
Yah, saya sebenarnya tidak keberatan melakukan itu terlalu banyak, tetapi ketika saya mengajar akan mundur, saya ingin menunjukkan kepada siswa saya simetri yang bagus (yaitu dengan perbedaan minimal, misalnya hanya menambahkan kebalikan, atau langkah -1, tetapi tanpa memodifikasi hal lain). Anda dapat melakukan (untuk simetri):
dan
yang saya tidak suka banyak, tetapi Anda tidak bisa melakukannya
Anda akhirnya bisa melakukannya
tapi saya ingin mengajar Ruby murni daripada pendekatan berorientasi objek (dulu). Saya ingin mengulangi:
Saya percaya ini tidak mungkin tanpa mendefinisikan
pred
metode, yang berarti memodifikasi kelas Range untuk menggunakannya. Jika Anda dapat melakukan ini, beri tahu saya, jika tidak, konfirmasi ketidakmungkinan akan dihargai meskipun itu akan mengecewakan. Mungkin Ruby 1.9 membahas ini.(Terima kasih atas waktu Anda membaca ini.)
sumber
1.upto(10) do |i| puts i end
dan10.downto(1) do puts i end
jenis memberikan simetri yang Anda inginkan. Semoga itu bisa membantu. Tidak yakin apakah itu akan berfungsi untuk string dan semacamnya.[*1..10].each{|i| puts "i=#{i}" }
.Gunakan each_with_index saat Anda membutuhkan keduanya.
sumber
Jawaban lainnya baik-baik saja, tetapi saya ingin menunjukkan satu hal lain: Array dipesan, sedangkan Hash tidak dalam 1,8. (Di Ruby 1.9, Hash dipesan dengan urutan penyisipan kunci.) Jadi, tidak masuk akal sebelum 1.9 untuk beralih ke Hash dengan cara / urutan yang sama seperti Array, yang selalu memiliki pemesanan yang pasti. Saya tidak tahu apa urutan default untuk array asosiatif PHP (rupanya google fu saya juga tidak cukup kuat untuk mengetahuinya), tetapi saya tidak tahu bagaimana Anda dapat mempertimbangkan array PHP reguler dan array asosiatif PHP untuk menjadi "sama" dalam konteks ini, karena urutan untuk array asosiatif tampaknya tidak terdefinisi.
Karena itu, cara Ruby tampak lebih jelas dan intuitif bagi saya. :)
sumber
Mencoba melakukan hal yang sama secara konsisten dengan array dan hash mungkin hanya bau kode, tetapi, dengan risiko saya dicap sebagai pembuat patch-setengah monyet, jika Anda mencari perilaku yang konsisten, akankah ini berhasil? ?:
sumber
Berikut adalah empat opsi yang tercantum dalam pertanyaan Anda, yang diatur oleh kebebasan kontrol. Anda mungkin ingin menggunakan yang berbeda tergantung pada apa yang Anda butuhkan.
Cukup melalui nilai-nilai:
Cukup telusuri indeks:
Pergi melalui indeks + variabel indeks:
Kontrol jumlah loop + variabel indeks:
sumber
Saya sudah mencoba membangun menu (di Camping dan Markaby ) menggunakan hash.
Setiap item memiliki 2 elemen: label menu dan URL , jadi hash tampak benar, tetapi URL '/' untuk 'Home' selalu muncul terakhir (seperti yang Anda harapkan untuk hash), sehingga item menu muncul dengan cara yang salah memesan.
Menggunakan array dengan
each_slice
melakukan pekerjaan:Menambahkan nilai ekstra untuk setiap item menu (mis. Seperti nama ID CSS ) hanya berarti meningkatkan nilai slice. Jadi, seperti hash tetapi dengan grup yang terdiri dari sejumlah item. Sempurna.
Jadi ini hanya untuk mengucapkan terima kasih karena secara tidak sengaja mengisyaratkan solusi!
Jelas, tetapi patut dinyatakan: Saya sarankan memeriksa apakah panjang array dapat dibagi dengan nilai slice.
sumber
Jika Anda menggunakan mixin enumerable (seperti halnya Rails), Anda dapat melakukan sesuatu yang mirip dengan cuplikan php yang tercantum. Cukup gunakan metode each_slice dan ratakan hash.
Diperlukan sedikit penambalan monyet.
Namun, ini menyebabkan masalah ketika Anda memiliki array rekursif atau hash dengan nilai array. Dalam ruby 1.9 masalah ini diselesaikan dengan parameter ke metode rata yang menentukan seberapa dalam untuk recurse.
Adapun pertanyaan apakah ini bau kode, saya tidak yakin. Biasanya ketika saya harus membungkuk ke belakang untuk mengulangi sesuatu yang saya melangkah mundur dan menyadari saya salah menyerang masalah.
sumber
Cara yang benar adalah yang paling nyaman bagi Anda dan melakukan apa yang Anda inginkan. Dalam pemrograman jarang ada satu cara 'benar' untuk melakukan sesuatu, lebih sering ada beberapa cara untuk memilih.
Jika Anda merasa nyaman dengan cara tertentu dalam melakukan sesuatu, lakukan saja, kecuali itu tidak berhasil - maka inilah saatnya untuk menemukan cara yang lebih baik.
sumber
Di Ruby 2.1, metode each_with_index dihapus. Sebagai gantinya, Anda dapat menggunakan each_index
Contoh:
menghasilkan:
sumber
each_with_index
tidak muncul dalam dokumentasi adalah karena disediakan olehEnumerable
modul.Menggunakan metode yang sama untuk iterasi melalui kedua array dan hash masuk akal, misalnya untuk memproses struktur hash dan array bersarang sering dihasilkan dari parser, dari membaca file JSON dll.
Salah satu cara cerdas yang belum disebutkan adalah bagaimana hal itu dilakukan di pustaka Ruby Facets dari ekstensi pustaka standar. Dari sini :
Sudah ada
Hash#each_pair
alias aliasHash#each
. Jadi setelah tambalan ini, kami juga memilikiArray#each_pair
dan dapat menggunakannya secara bergantian untuk beralih melalui Hash dan Array. Ini memperbaiki kegilaan yang diamati OP yangArray#each_with_index
memiliki argumen blok terbalik dibandingkan denganHash#each
. Contoh penggunaan:sumber