“outer”关键字,Juliafor循环变量作用域
我想使用 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
问题:如何使iterfor循环块外可见?
回答
解决方案是outer按照官方文档中的描述使用:Loops-and-Comprehensions
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