"outer"关键字,朱莉娅为循环变量范围



我想使用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

最新更新