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

Jia*_*ang 3 julia

当我重新定义一个已经传递给另一个函数的函数时,似乎重新定义没有传递给该函数.

 function foo(f)
        f(3)
    end

f(x)=x

foo(f) #=>3

f(x)=x*x

foo(f) #=>3

f(3) #=>9
Run Code Online (Sandbox Code Playgroud)

这种行为对我来说看起来很奇怪.这背后的逻辑是什么?

Dan*_*etz 5

运行f(x)=x*x会提示definition overwritten警告.警告警告这种行为的可能性.通常,在引用它的某些其他函数已经编译时重新定义函数是棘手的.正如2011年的http://github.com/julialang/julia/issues/265所示,这是一个老问题.

程序可以小心避免这个问题.例如,foo()在问题中使用匿名函数将给出:

julia> foo(x->x)
3
julia> foo(x->x*x)
9
Run Code Online (Sandbox Code Playgroud)

在Julia 0.6中,此问题已得到解决.Github问题详述了解决方案,但基本上,Julia会跟踪世界的版本号,而功能"看到"某个版本的世界.在REPL中,重新定义会导致对旧函数的调用触发重新编译(有关详细信息,请参阅http://docs.julialang.org/en/latest/manual/methods.html#).由此产生的行为不那么奇怪:

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> # :-)
Run Code Online (Sandbox Code Playgroud)

感谢@StefanKarpinski,@ ChrisRackauckas