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

标签 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 提示定义被覆盖 警告。该警告提醒您注意此类行为的可能性。一般来说,在其他一些引用它的函数已经被编译时重新定义函数是很棘手的。作为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/

相关文章:

julia - 如何在 Atom 中运行 Julia 脚本

metaprogramming - Julia 自动生成函数并导出它们

julia - `size` 在 julia 中使用嵌套复合类型时没有匹配 size(::Data{Float32}) 的方法

inheritance - 如何调用父类(super class)型方法?

linux - 关闭命令提示符或腻子后如何保持 julia 运行

julia - 是什么让 Julia 可组合?

iterator - 如何在 Julia 1.0 中创建自定义迭代器?

arrays - 如何根据两个数组之一中的值对两个数组进行有效排序?

julia - 如何别名 quit() 退出?

julia - 如何从图像中提取RGB值并计算其输出?