我想使用for循环来实现迭代方法。在循环结束时,我还想检查是否达到max_iter
:
function iterative_method()
iter_max = 10
for iter in 1:iter_max
# some computations
# ...
# if converged
# break
# end
end
@assert iter!=iter_max "max iteration = $iter_max reached!"
end
不幸的是,@assert
无法工作,因为iter
超出范围:
julia> iterative_method()
ERROR: UndefVarError: iter not defined
问题:如何使iter
在for循环块外可见?
解决方案是使用官方文档中描述的outer
:循环和理解
function iterative_method()
iter_max = 10
local iter # <- declare "iter" variable
for outer iter in 1:iter_max # <- use "outer" keyword
# some computations
# ...
# if converged
# break
# end
end
@assert iter!=iter_max "max iteration = $iter_max reached!"
end
它现在如预期的那样工作:
julia> iterative_method()
ERROR: AssertionError: max iteration = 10 reached!
然而,Julia核心开发人员对添加此功能表示遗憾,并可能在Julia 2.0中删除它,因此用以下稍微详细一点的版本来表达这一点可能更清晰、更简单:
function iterative_method()
iter_max = 10
local iter
for i in 1:iter_max
iter = i
# some computations
# ...
# if converged
# break
# end
end
@assert iter!=iter_max "max iteration = $iter_max reached!"
end