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中的函数定义如何出错的理解在哪里?
答案 0 :(得分: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
一切正常。区别在于,您创建了一个匿名函数并将其分配给变量。
答案 1 :(得分: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