在Julia中,为什么函数的作用域规则与其他第一类对象相比显得不一致?

在Julia中,为什么函数的作用域规则与其他第一类对象相比显得不一致?,julia,first-class-functions,Julia,First Class Functions,Julia文档声明函数是第一类对象。我理解这意味着我应该能够使用和定义它们,就像使用普通的旧数据类型一样 因此,我很惊讶 function a(b::Int64) if b > 0 c = 1 else c = -1 end end a(2) 工作得很漂亮,而 function d(e::Int64) if e > 0 println("Positive argument") funct

Julia文档声明函数是第一类对象。我理解这意味着我应该能够使用和定义它们,就像使用普通的旧数据类型一样

因此,我很惊讶

function a(b::Int64)
    if b > 0
        c = 1
    else
        c = -1
    end
end
a(2)
工作得很漂亮,而

function d(e::Int64)
    if e > 0
        println("Positive argument")
        function f()
            println("Return positive")
            return e
        end
    else
        println("Negative argument")
        function f()
            println("Return negative")
            return e
        end
    end
    return f
end
使用时可以工作,但做了一些非常违反直觉的事情:

>>> g = d(2)
Positive argument
(::f) (generic function with 1 method)
>>> g()
Return negative
2
或者:

>>> g = d(-2)
Negative argument
ERROR: UnderVarError: f not defined
这可能比返回意料之外的东西更有用,但仍然是更令人困惑的


我希望从相应分支返回
f
的版本。我对Julia中的函数定义如何出错的理解在哪里?

我可以向您展示如何解决问题,但您描述的实际行为是一个已知的问题

通常,如果您这样做:

function d(e::Int64)
    if e > 0
        println("Positive argument")
        f = function()
            println("Return positive")
            return e
        end
    else
        println("Negative argument")
        f = function()
            println("Return negative")
            return e
        end
    end
    return f
end

一切正常。不同之处在于您创建了一个匿名函数并将其分配给一个变量。

在代码中,您已经定义了两次相同的函数f, 即使它是在“如果那么其他”结构的不同部分

我认为你可以通过这样做来解决它

function d(e::Int64)
    if e > 0
        println("Positive argument")
        function Alpha()
            println("Return positive")
            return e
        end
        return Alpha
    else
        println("Negative argument")
        function Beta()
            println("Return negative")
            return e
        end
        return Beta
    end
end