在Julia中,为什么局部作用域中的 "if false "语句可以修改函数定义?

问题描述 投票:10回答:1

在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 julia scoping
1个回答
5
投票

解决方法是在这种情况下使用匿名函数。

function main()
  test = () -> 0
  if false
    test = () -> 1
  end

  println(test())
end

julia> main()
0

至于为什么,这就涉及到了核心的问题了 定义和重新定义一个函数的特定方法意味着什么?.

© www.soinside.com 2019 - 2024. All rights reserved.