4

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 中的函数定义如何工作的理解哪里出了问题?

4

2 回答 2

6

我可以向您展示如何解决问题,但您描述的实际行为是一个已知问题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

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

于 2018-08-13T13:39:01.537 回答
0

在您的代码中,您定义了相同的函数 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
于 2018-08-14T04:19:20.153 回答