函数可以在Julia中本地化吗?这意味着什么?

时间:2019-06-14 21:35:18

标签: julia

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

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

在模块中具有局部功能是什么意思?它是私人的吗?默认情况下,不是所有函数都在声明它们的作用域中声明为局部函数吗?如果是这种情况,则本地关键字对于函数来说是多余的?

1 个答案:

答案 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关键字,则会创建一个隐式本地范围,因此值可以从该范围泄漏,但不能泄漏到变量绑定之外。