3
当我重新定义一个已经传递给另一个函数的函数时,看起来重定义没有被传递到该函数中。函数参数传递和函数重定义在Julia中
function foo(f)
f(3)
end
f(x)=x
foo(f) #=>3
f(x)=x*x
foo(f) #=>3
f(3) #=>9
这种行为对我来说看起来很奇怪。这背后的逻辑是什么?
当我重新定义一个已经传递给另一个函数的函数时,看起来重定义没有被传递到该函数中。函数参数传递和函数重定义在Julia中
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
提示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
的[传递更新的功能,以现有的功能(可能的复制http://stackoverflow.com/questions/ 40057740 /传递更新函数到现有函数) – Gnimuc
运行'f(x)= x * x'会提示'定义覆盖'警告。警告提醒可能发生这种行为。一般来说,当引用它的其他函数已经被编译时,重新定义函数是非常棘手的。正如https://github.com/julialang/julia/issues/265从2011年表明,这是一个老问题,但我想程序可以重构,以避免这个问题。 –
@DanGetz,你应该把它作为答案。 – StefanKarpinski