Saya tidak mengatakan bahwa Array
-> |value,index|
dan Hash
-> |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
atau hash[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:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
Tapi Ruby adalah tentang gula sintaksis yang kuat dan kekuatan berorientasi objek, tapi bagaimanapun, ini setara dengan hash, dan kunci dapat dipesan atau tidak:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
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):
(1..10).each{|i| puts "i=#{i}" }
tapi saya tidak suka melakukan (untuk mundur):
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
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):
(a=*1..10).each{|i| puts "i=#{i}" }
dan
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
yang saya tidak suka banyak, tetapi Anda tidak bisa melakukannya
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
Anda akhirnya bisa melakukannya
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
tapi saya ingin mengajar Ruby murni daripada pendekatan berorientasi objek (dulu). Saya ingin mengulangi:
- tanpa membuat array (pertimbangkan 0..1000000000)
- bekerja untuk Rentang apa pun (mis. String, bukan hanya Bilangan Bulat)
- tanpa menggunakan kekuatan berorientasi objek tambahan (yaitu tidak ada modifikasi kelas)
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.)
array#each_with_index
menggunakan|value, key|
karena nama metode menyiratkan urutan, sedangkan urutan yang digunakan untukhash#each
meniruhash[key] = value
sintaks?