Julia是否支持带有函数范围的静态变量

Mag*_*eek 10 static julia

在C中,可以声明具有局部函数范围的静态变量(示例).

朱莉娅可以做类似的事吗?

我的用例是声明子函数,但不希望Julia每次执行代码时都必须重新解析它们.在函数之外声明它们是丑陋的并且给它们更高的范围,我想避免它.

例:

function foo(x)
    static bar = t -> stuff with t

    ...
    bar(y)
    ...
end
Run Code Online (Sandbox Code Playgroud)

虽然我可以在foo()之外声明bar(),但我更喜欢bar只在本地命名空间中.

谢谢.

iva*_*rne 12

您可以围绕函数创建新范围,以保存变量.

let
    global foo
    function bar(t)
        #stuff with t
    end
    y = 2
    function foo(x)
        #...
        bar(y)
        #...
    end
end
Run Code Online (Sandbox Code Playgroud)

然后只有foo(x)外面可见


kms*_*ire 5

请注意,y在@ivarne的答案中需要将其作为let变量,否则它将覆盖y全局范围内的任何变量:

julia> y = 4
4

julia> let
           global foo
           function bar(t)
               #stuff with t
           end
           y = 2
           function foo(x)
               #...
               bar(y)
               #...
           end
       end
foo (generic function with 1 method)

julia> y
2
Run Code Online (Sandbox Code Playgroud)


bec*_*cko 5

基于@ivarne 的回答。

let bar = t -> t^2
    global foo
    function foo(x)
        bar(x)
    end
end
Run Code Online (Sandbox Code Playgroud)

但我不认为这是一个理想的解决方案。恕我直言,最好有一个static关键字。额外的块是笨重的。在 Julia 开发中有一些关于这个的讨论:

https://github.com/JuliaLang/julia/issues/15056

https://github.com/JuliaLang/julia/issues/12627