Tôi không nói rằng Array
-> |value,index|
và Hash
-> |key,value|
không điên rồ (xem bình luận của Horace Loeb), nhưng tôi đang nói rằng có một cách lành mạnh để mong đợi sự sắp xếp này.
Khi tôi đang xử lý các mảng, tôi tập trung vào các phần tử trong mảng (không phải chỉ mục vì chỉ mục là nhất thời). Phương thức này là mỗi với chỉ mục, tức là mỗi + chỉ mục, hoặc | mỗi, chỉ mục |, hoặc |value,index|
. Điều này cũng phù hợp với chỉ mục được xem như một đối số tùy chọn, ví dụ | value | tương đương với | value, index = nil | phù hợp với | giá trị, chỉ số |.
Khi tôi đang đối phó với băm, tôi thường xuyên hơn tập trung vào các phím hơn các giá trị, và tôi thường đối phó với các phím và các giá trị theo thứ tự đó, một trong hai key => value
hoặc hash[key] = value
.
Nếu bạn muốn gõ vịt, thì rõ ràng sử dụng một phương thức được xác định như Brent Longborough đã hiển thị hoặc một phương thức ngầm như maxhawkins đã hiển thị.
Ruby là tất cả về việc cung cấp ngôn ngữ cho phù hợp với lập trình viên, không phải là về lập trình viên phù hợp với ngôn ngữ. Đây là lý do tại sao có rất nhiều cách. Có rất nhiều cách để suy nghĩ về một cái gì đó. Trong Ruby, bạn chọn mã gần nhất và phần còn lại của mã thường rơi ra cực kỳ gọn gàng và chính xác.
Đối với câu hỏi ban đầu, "Cách thức đúng đắn của người Bỉ để lặp qua một mảng trong Ruby là gì?", Tôi nghĩ rằng cách cốt lõi (nghĩa là không có cú pháp cú pháp mạnh mẽ hoặc sức mạnh hướng đối tượng) là để làm:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
Nhưng Ruby là tất cả về sức mạnh cú pháp mạnh mẽ và hướng đối tượng, nhưng dù sao ở đây là tương đương với băm, và các phím có thể được đặt hàng hoặc không:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
Vì vậy, câu trả lời của tôi là, "Cách thức ngay lập tức để chuyển qua một mảng trong Ruby phụ thuộc vào bạn (tức là lập trình viên hoặc nhóm lập trình) và dự án.". Lập trình viên Ruby tốt hơn làm cho sự lựa chọn tốt hơn (trong đó sức mạnh cú pháp và / hoặc cách tiếp cận hướng đối tượng). Lập trình viên Ruby tốt hơn tiếp tục tìm kiếm nhiều cách hơn.
Bây giờ, tôi muốn hỏi một câu hỏi khác, "Cách thức đúng đắn của Hồi giáo để lặp qua một phạm vi trong Ruby ngược là gì?"! (Câu hỏi này là cách tôi đến trang này.)
Đó là tốt đẹp để làm (cho về phía trước):
(1..10).each{|i| puts "i=#{i}" }
nhưng tôi không thích làm (cho ngược):
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
Chà, tôi thực sự không bận tâm đến việc đó quá nhiều, nhưng khi tôi dạy ngược, tôi muốn cho học sinh của mình thấy một sự đối xứng đẹp (nghĩa là với sự khác biệt tối thiểu, ví dụ như chỉ thêm một bước lùi, hoặc một bước -1, nhưng không có sửa đổi bất cứ điều gì khác). Bạn có thể làm (đối xứng):
(a=*1..10).each{|i| puts "i=#{i}" }
và
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
điều mà tôi không thích nhiều, nhưng bạn không thể làm
(*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
Cuối cùng bạn có thể làm
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
nhưng tôi muốn dạy Ruby thuần túy hơn là các cách tiếp cận hướng đối tượng (chưa có). Tôi muốn lặp lại ngược lại:
- mà không tạo ra một mảng (xem xét 0..1000000000)
- làm việc cho bất kỳ Phạm vi nào (ví dụ: Chuỗi, không chỉ Số nguyên)
- mà không sử dụng bất kỳ sức mạnh hướng đối tượng bổ sung (nghĩa là không sửa đổi lớp)
Tôi tin rằng điều này là không thể nếu không định nghĩa một pred
phương thức, có nghĩa là sửa đổi lớp Range để sử dụng nó. Nếu bạn có thể làm điều này xin vui lòng cho tôi biết, nếu không thì việc xác nhận tính không thể sẽ được đánh giá cao mặc dù điều đó sẽ gây thất vọng. Có lẽ Ruby 1.9 giải quyết điều này.
(Cảm ơn bạn đã dành thời gian đọc nó.)
array#each_with_index
sử dụng|value, key|
vì tên phương thức ngụ ý thứ tự, trong khi thứ tự được sử dụng đểhash#each
bắt chướchash[key] = value
cú pháp?