輸入驗證
雖然傳統上不考慮迴圈,但 @goto
和 @label
巨集可用於更高階的控制流程。一個用例是當一個部分的失敗導致整個函式的重試時,通常在輸入驗證中有用:
function getsequence()
local a, b
@label start
print("Input an integer: ")
try
a = parse(Int, readline())
catch
println("Sorry, that's not an integer.")
@goto start
end
print("Input a decimal: ")
try
b = parse(Float64, readline())
catch
println("Sorry, that doesn't look numeric.")
@goto start
end
a, b
end
但是,使用遞迴通常更清楚這個用例:
function getsequence()
local a, b
print("Input an integer: ")
try
a = parse(Int, readline())
catch
println("Sorry, that's not an integer.")
return getsequence()
end
print("Input a decimal: ")
try
b = parse(Float64, readline())
catch
println("Sorry, that doesn't look numeric.")
return getsequence()
end
a, b
end
雖然兩個例子都做同樣的事情,但第二個更容易理解。但是,第一個更高效能(因為它避免了遞迴呼叫)。在大多數情況下,通話費用無關緊要; 但在有限的情況下,第一種形式是可以接受的。