如何提前退出 while 循环
How to exit a while loop prematurely
假设我有一个无限的 while
循环,我想退出循环。这样做的正确方法是什么? OCaml 没有 break
,因此我可能不得不引发异常以终止循环 (try while true do ... raise My_exception ... done with My_exception -> ()
)。这是退出无限循环的惯用方式吗?我应该在循环中引发哪个异常?
您可以使用本地异常来确保循环内的函数调用不会干扰您的控制流:
let exception Early_exit in
try while ...
raise Early_exit
done;
...
with Early_exit -> ...
Is this the idiomatic way to exit infinite loops?
是的,这是一种相当惯用的退出 non-idiomatic 无限循环的方法。甚至还有一个随时可用的例外,称为 Exit
1,例如,
let main () =
try while true do
let continue = work () in
if not continue then raise Exit;
done
with Exit -> ()
话虽如此,编码无限循环的惯用且正确的方法是使用递归。它不仅更易读,而且具有自然的退出循环方式,例如函数式样式中相同的无限循环,
let rec main () =
if work () then main ()
1) 尽管最好像@octachron 那样定义自己的异常,以避免与也依赖于此异常的其他代码发生冲突的可能性。
假设我有一个无限的 while
循环,我想退出循环。这样做的正确方法是什么? OCaml 没有 break
,因此我可能不得不引发异常以终止循环 (try while true do ... raise My_exception ... done with My_exception -> ()
)。这是退出无限循环的惯用方式吗?我应该在循环中引发哪个异常?
您可以使用本地异常来确保循环内的函数调用不会干扰您的控制流:
let exception Early_exit in
try while ...
raise Early_exit
done;
...
with Early_exit -> ...
Is this the idiomatic way to exit infinite loops?
是的,这是一种相当惯用的退出 non-idiomatic 无限循环的方法。甚至还有一个随时可用的例外,称为 Exit
1,例如,
let main () =
try while true do
let continue = work () in
if not continue then raise Exit;
done
with Exit -> ()
话虽如此,编码无限循环的惯用且正确的方法是使用递归。它不仅更易读,而且具有自然的退出循环方式,例如函数式样式中相同的无限循环,
let rec main () =
if work () then main ()
1) 尽管最好像@octachron 那样定义自己的异常,以避免与也依赖于此异常的其他代码发生冲突的可能性。