Julia中的函数参数传递与函数重定义

Julia中的函数参数传递与函数重定义,julia,Julia,当我重新定义一个已传递到另一个函数中的函数时,似乎没有将重新定义传递到该函数中 function foo(f) f(3) end f(x)=x foo(f) #=>3 f(x)=x*x foo(f) #=>3 f(3) #=>9 我觉得这种行为很奇怪。这背后的逻辑是什么?运行f(x)=x*x会提示一个定义被覆盖的警告。警告提醒了这种行为的可能性。一般来说,当其他引用函数的函数已经编译时,重新定义函数是很棘手的。从2011年开始,这是一个老问

当我重新定义一个已传递到另一个函数中的函数时,似乎没有将重新定义传递到该函数中

 function foo(f)
        f(3)
    end

f(x)=x

foo(f) #=>3

f(x)=x*x

foo(f) #=>3

f(3) #=>9
我觉得这种行为很奇怪。这背后的逻辑是什么?

运行
f(x)=x*x
会提示一个
定义被覆盖的警告。警告提醒了这种行为的可能性。一般来说,当其他引用函数的函数已经编译时,重新定义函数是很棘手的。从2011年开始,这是一个老问题

程序可以小心地避免此问题。例如,在问题中使用带有
foo()
的匿名函数将给出:

julia> foo(x->x)
3
julia> foo(x->x*x)
9
在Julia 0.6中,此问题已得到解决。Github问题详细说明了解决方案,但从本质上讲,Julia跟踪世界的版本号,并使用函数“查看”世界的某个版本。在REPL中,重新定义会导致对旧函数的调用触发重新编译(有关详细信息,请参阅)。由此产生的行为就不那么奇怪了:

julia> # version 6.0
julia> function foo(f)
       f(3)
       end
foo (generic function with 1 method)
julia> f(x)=x
f (generic function with 1 method)
julia> foo(f)
3
julia> f(x)=x*x
f (generic function with 1 method)    
julia> foo(f)
9
julia> # :-)

多亏了@StefanKarpinski,@ChrisRackauckas

可能重复运行
f(x)=x*x
会提示
定义被覆盖
警告。警告提醒了这种行为的可能性。一般来说,当其他引用函数的函数已经编译时,重新定义函数是很棘手的。从2011年开始,这是一个老问题,但我想可以重构程序来避免这个问题。@DanGetz,你应该把它作为一个答案发布出来。还应该提到的是,265已经在v0.6中修复,所以在几周后,这对大多数用户来说将不再是问题。也许答案应该是这样的:“但我想程序可以重构以避免这个问题。”只需使用匿名函数。