当我重新定义一个已传递给另一个函数的函数时,似乎重新定义没有传递给那个函数。
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
提示定义被覆盖
警告。该警告提醒您注意此类行为的可能性。一般来说,在其他一些引用它的函数已经被编译时重新定义函数是很棘手的。作为http://github.com/julialang/julia/issues/265从 2011 年开始,这是一个老问题。
程序可以小心避免这个问题。例如,在问题中使用带有 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
关于julia - Julia 中的函数参数传递和函数重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42872217/