Không bao giờ sử dụng for
nó có thể gây ra lỗi.
Sự khác biệt là tinh tế nhưng có thể gây ra lỗi rất lớn!
Đừng để bị lừa, đây không phải là về các vấn đề về mã hoặc thành ngữ. Đây là vấn đề tránh các lỗi gần như không thể tháo gỡ trong mã sản xuất. Việc thực hiện của Ruby for
có một lỗ hổng nghiêm trọng và không nên được sử dụng. Luôn sử dụng các vòng each
, không bao giờ sử dụng vòng lặp for
.
Dưới đây là một ví dụ nơi for
giới thiệu một lỗi,
class Library
def initialize
@ary = []
end
def method_with_block(&block)
@ary << block
end
def method_that_uses_these_blocks
@ary.map(&:call)
end
end
lib = Library.new
for n in %w{foo bar quz}
lib.method_with_block { n }
end
puts lib.method_that_uses_these_blocks
Prints
quz
quz
quz
Sử dụng %w{foo bar quz}.each { |n| ... }
in
foo
bar
quz
Tại sao?
Trong vòng lặp for
biến số n
được xác định một lần và chỉ và sau đó một định nghĩa được sử dụng cho tất cả các lần lặp lại. Do đó, mỗi khối tham chiếu đến cùng một số n
có giá trị là quz
vào thời điểm kết thúc vòng lặp. Lỗi!
Vòng lặp each
biến mới n
được xác định cho mỗi lần lặp, ví dụ trên biến n
được xác định ba lần riêng biệt. Do đó, mỗi khối tham chiếu đến một số n
riêng biệt với các giá trị chính xác.
Có _is_ một sự khác biệt nhỏ (như yjerem, ChristopheD và Bayard đề cập) liên quan đến phạm vi biến. – Telemachus
Không chính xác, 'for' không sử dụng' each' bên dưới. Xem các câu trả lời khác. – akuhn
@akuhn Để biết thêm chi tiết, vui lòng xem [câu hỏi] này (http://stackoverflow.com/q/39839809/5101493) và cả hai câu trả lời tuyệt vời của nó. –