在Julia中,为什么函数的作用域规则与其他第一类对象相比显得不一致?
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
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