在 Julia 中,为什么局部范围内的 "if false" 语句可以修改函数定义?
In Julia, why can "if false" statements in local scope modify function definitions?
在 Julia 1.4.1 中,如果我在全局范围内定义一个函数,"if false" 语句后的修改不会影响它,正如预期的那样:
test()=0
if false
test()=1
end
println(test())
这会打印“0”,这是应该的。但是,当我将此代码包含在本地范围内时,行为会发生变化:
function main()
test()=0
if false
test()=1
end
println(test())
end
main()
这现在打印出我没想到的“1”。如果我将 "test" 更改为数组或浮点数,我没有观察到预期的修改,即问题不会发生。为什么 Julia 的函数会这样?
解决方案是在这种情况下使用匿名函数:
function main()
test = () -> 0
if false
test = () -> 1
end
println(test())
end
julia> main()
0
至于为什么,这就是what it means to define and redefine a particular method of a function的核心。
在 Julia 1.4.1 中,如果我在全局范围内定义一个函数,"if false" 语句后的修改不会影响它,正如预期的那样:
test()=0
if false
test()=1
end
println(test())
这会打印“0”,这是应该的。但是,当我将此代码包含在本地范围内时,行为会发生变化:
function main()
test()=0
if false
test()=1
end
println(test())
end
main()
这现在打印出我没想到的“1”。如果我将 "test" 更改为数组或浮点数,我没有观察到预期的修改,即问题不会发生。为什么 Julia 的函数会这样?
解决方案是在这种情况下使用匿名函数:
function main()
test = () -> 0
if false
test = () -> 1
end
println(test())
end
julia> main()
0
至于为什么,这就是what it means to define and redefine a particular method of a function的核心。