Ruby không may là một chút khác nhau. Tái bút: Trí nhớ của tôi hơi mơ hồ về điều này nên xin lỗi nếu tôi sai
thay vì break / continue, nó có break / next, hoạt động tương tự về các vòng lặp
Vòng lặp (giống như mọi thứ khác) là các biểu thức và "trả lại" điều cuối cùng mà chúng đã làm. Hầu hết thời gian, nhận được giá trị trả về từ một vòng lặp là vô nghĩa, vì vậy mọi người chỉ cần làm điều này
a = 5
while a < 10
a + 1
end
Tuy nhiên bạn có thể làm điều này
a = 5
b = while a < 10
a + 1
end # b is now 10
TUY NHIÊN, rất nhiều mã ruby 'mô phỏng' một vòng lặp bằng cách sử dụng một khối. Ví dụ kinh điển là
10.times do |x|
puts x
end
Vì nó phổ biến hơn nhiều đối với mọi người muốn làm mọi thứ với kết quả của một khối, đây là nơi nó trở nên lộn xộn. break / next có nghĩa là những thứ khác nhau trong bối cảnh của một khối.
phá vỡ sẽ nhảy ra khỏi mã được gọi là khối
tiếp theo sẽ bỏ qua phần còn lại của mã trong khối và 'trả lại' những gì bạn chỉ định cho người gọi của khối. Điều này không có ý nghĩa gì nếu không có ví dụ.
def timesten
10.times{ |t| puts yield t }
end
timesten do |x|
x * 2
end
# will print
2
4
6
8 ... and so on
timesten do |x|
break
x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped
timesten do |x|
break 5
x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5
timesten do |x|
next 5
x * 2
end
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.
Vì vậy, vâng. Ruby là tuyệt vời, nhưng nó có một số trường hợp góc khủng khiếp. Đây là thứ tồi tệ thứ hai tôi từng thấy trong những năm sử dụng nó :-)