当我重新定义一个已经传递给另一个函数的函数时,似乎重新定义没有传递给该函数。
function foo(f)
f(3)
end
f(x)=x
foo(f) #=>3
f(x)=x*x
foo(f) #=>3
f(3) #=>9
这种行为对我来说太奇怪了。这背后的逻辑是什么?
答案 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