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

In Julia, why do scope rules for functions appear inconsistent compared to other first class objects?

Julia 文档声明函数首先是 class 个对象。我理解这意味着我应该能够以与普通旧数据类型相同的方式使用和定义它们。

因此我很惊讶

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

这可能比返回意外的东西更有用,但 none 越少越令人困惑。

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

我可以告诉你如何解决这个问题,但你描述的实际行为是一个已知问题 https://github.com/JuliaLang/julia/issues/15602

一般来说,如果你这样做:

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 两次, 即使它位于 "if then else" 结构的不同部分

我想你可以这样解决

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