2017-03-18 59 views
3

当我重新定义一个已经传递给另一个函数的函数时,看起来重定义没有被传递到该函数中。函数参数传递和函数重定义在Julia中

function foo(f) 
     f(3) 
    end 

f(x)=x 

foo(f) #=>3 

f(x)=x*x 

foo(f) #=>3 

f(3) #=>9 

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

+2

的[传递更新的功能,以现有的功能(可能的复制http://stackoverflow.com/questions/ 40057740 /传递更新函数到现有函数) – Gnimuc

+3

运行'f(x)= x * x'会提示'定义覆盖'警告。警告提醒可能发生这种行为。一般来说,当引用它的其他函数已经被编译时,重新定义函数是非常棘手的。正如https://github.com/julialang/julia/issues/265从2011年表明,这是一个老问题,但我想程序可以重构,以避免这个问题。 –

+0

@DanGetz,你应该把它作为答案。 – StefanKarpinski

回答

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 

在茱莉亚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