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

时间:2017-03-18 08:39:34

标签: julia

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

 function foo(f)
        f(3)
    end

f(x)=x

foo(f) #=>3

f(x)=x*x

foo(f) #=>3

f(3) #=>9

这种行为对我来说太奇怪了。这背后的逻辑是什么?

1 个答案:

答案 0 :(得分: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

在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> # :-)

感谢@StefanKarpinski,@ ChrisRackauckas