函数定义悖论

abe*_*ysh 1 function julia

考虑Julia中的以下函数定义:

plustwo = function(x)
    x + 2
end

function addtwo(x)
    x + 2
end
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这两个定义都是有效的,并且行为方式相同.也就是说,

typeof(plustwo)
julia> Function

typeof(addtwo)
julia> Function

plustwo(3)
julia> 5

addtwo(3)
julia> 5
Run Code Online (Sandbox Code Playgroud)

对此有何评论?

这是否意味着朱莉娅内有几种方言?

Rez*_*lan 6

他们两人都是功能,但是,addtwogeneric可能有不同的方法的功能,同时plustwo是一个anonymous功能.

julia> addtwo.env
# 1 method for generic function "addtwo":
addtwo(x) at none:2

julia> plustwo.env
svec()
Run Code Online (Sandbox Code Playgroud)

人们可以在运行时简单地改变匿名函数的代码,

 julia> plustwo.code
AST(:($(Expr(:lambda,Any[:(x::Any)],Any[Any[Any[:x,:Any,0]],Any[],0,Any[]], :(
begin  # none, line 2:
        return x + 2
    end)))))

julia> addtwo.code
ERROR: UndefRefError: access to undefined reference
Run Code Online (Sandbox Code Playgroud)

generic功能有更好的性能和anonymous功能更适合META编程.

  • 此外,第二种形式将隐式地使`addtwo`成为`const`,这允许编译器优化更多的情况,因为要调用的函数是已知的. (3认同)