首页 > 解决方案 > 函数可以在 Julia 中是本地的吗?这意味着什么?

问题描述

根据使用 Julia 1.1 的 Julia repl,这是有效的 Julia:

julia> local function f()
       5
       end
(::getfield(Main, Symbol("#f#8"))) (generic function with 1 method)

在说模块中具有本地功能是什么意思?是私人的还是公开的?默认情况下,不是所有函数都在声明它们的范围内声明为本地函数吗?如果是这种情况,local 关键字对于函数来说是多余的吗?

标签: functionjulia

解决方案


在说模块中具有本地功能是什么意思?

我认为应该禁止这种语法。它没有记录它的作用。我在这里开启了一个讨论澄清这个问题。

是私人的还是公开的?

这个语法——据我所知——定义了一个没有引入到模块的全局方法表中的函数。因此,这个定义实际上类似于定义一个匿名函数,所以你可以这样做:

julia> x = (local f() = 1)
(::getfield(Main, Symbol("#f#3"))) (generic function with 1 method)

julia> x()
1

默认情况下,不是所有函数都在声明它们的范围内声明为本地函数吗?

是的。不允许将方法从本地范围添加到全局方法表。唯一的方法是使用eval通常不推荐在普通代码中使用的方法。

如果是这种情况,local 关键字对于函数来说是多余的吗?

不,它不是完全冗余的,因为有时在嵌套的局部作用域中需要它(通常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 中所述,这里是对这个问题的解释https://github.com/JuliaLang/julia/issues/10472#issuecomment-321584501在 GitHub 上。

总而言之 - 它像我假设的那样工作,技术原因是,如果 Julialocal在全局范围内看到关键字,则会创建一个隐式本地范围,因此值可以泄漏出这个范围,但不会泄漏变量绑定。


推荐阅读