Tôi chỉ muốn đưa ra một điểm cụ thể về vòng lặp for trong Ruby. Nó có vẻ giống như một cấu trúc tương tự như các ngôn ngữ khác, nhưng trên thực tế, nó là một biểu thức giống như mọi cấu trúc lặp khác trong Ruby. Trong thực tế, for in hoạt động với các đối tượng Enlessable giống như mỗi iterator.
Bộ sưu tập được truyền cho for có thể là bất kỳ đối tượng nào có mỗi phương thức lặp. Mảng và băm xác định từng phương thức và nhiều đối tượng Ruby khác cũng vậy. Vòng lặp for / in gọi mỗi phương thức của đối tượng đã chỉ định. Khi iterator mang lại các giá trị, vòng lặp for gán từng giá trị (hoặc từng bộ giá trị) cho biến đã chỉ định (hoặc biến) và sau đó thực thi mã trong phần thân.
Đây là một ví dụ ngớ ngẩn, nhưng minh họa điểm mà vòng lặp for hoạt động với bất kỳ đối tượng nào có một phương thức, giống như cách mỗi trình lặp thực hiện:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
Và bây giờ mỗi trình vòng lặp:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Như bạn có thể thấy, cả hai đều phản ứng với từng phương thức mang lại giá trị cho khối. Như mọi người ở đây đã nêu, chắc chắn nên sử dụng mỗi vòng lặp qua vòng lặp for. Tôi chỉ muốn lái xe về nhà rằng không có gì kỳ diệu về vòng lặp for. Đó là một biểu thức gọi từng phương thức của một bộ sưu tập và sau đó chuyển nó đến khối mã của nó. Do đó, đây là trường hợp rất hiếm bạn cần sử dụng để nhập. Sử dụng mỗi trình vòng lặp hầu như luôn luôn (với lợi ích bổ sung của phạm vi khối).