在 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的核心。