根据使用Julia 1.1的Julia repl,这是有效的Julia:
julia> local function f()
5
end
(::getfield(Main, Symbol("#f#8"))) (generic function with 1 method)
在模块中具有局部功能是什么意思?它是私人的吗?默认情况下,不是所有函数都在声明它们的作用域中声明为局部函数吗?如果是这种情况,则本地关键字对于函数来说是多余的?
答案 0 :(得分:1)
在模块中具有局部功能是什么意思?
我认为不应使用这种语法。它没有记录它的作用。我已经打开讨论here来澄清这个问题。
它是私人的吗?
据我所知,此语法定义了一个未引入模块的全局方法表中的函数。因此,此定义实际上类似于定义匿名函数,因此您可以执行以下操作:
julia> x = (local f() = 1)
(::getfield(Main, Symbol("#f#3"))) (generic function with 1 method)
julia> x()
1
不是所有的函数默认都在声明它们的作用域内声明为本地函数吗?
是的。不允许从本地范围将方法添加到全局方法表中。唯一的方法是使用eval
,通常在普通代码中不建议使用此方法。
如果是这种情况,则本地关键字对于函数来说是多余的?
否,它不是完全冗余的,因为有时在嵌套本地作用域中需要它(通常,对于任何变量名,在本地作用域中都需要local
)。参见以下示例:
julia> function f1()
f2() = 10
for i in 1:2
f2() = i
println(f2())
end
end
f1 (generic function with 1 method)
julia> f1()
ERROR: UndefVarError: i not defined
Stacktrace:
[1] f1() at .\REPL[3]:2
[2] top-level scope at none:0
julia> function f1()
f2() = 10
for i in 1:2
local f2() = i
println(f2())
end
end
f1 (generic function with 1 method)
julia> f1()
1
2
编辑
如Discourse所述,此处是GitHub上对此问题https://github.com/JuliaLang/julia/issues/10472#issuecomment-321584501的解释。
总而言之-它按照我所假设的那样工作,并且技术原因是,如果Julia在全局范围内看到local
关键字,则会创建一个隐式本地范围,因此值可以从该范围泄漏,但不能泄漏到变量绑定之外。