Julia是否支持函数作用域的静态变量?



在C语言中,可以声明具有局部函数作用域的静态变量(示例)。

可以在Julia中做类似的事情吗?

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

的例子:

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

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

谢谢。

您可以在函数周围创建一个新的作用域,以保存变量。

let
    global foo
    function bar(t)
        #stuff with t
    end
    y = 2
    function foo(x)
        #...
        bar(y)
        #...
    end
end

那么只有foo(x)对外可见

基于@ivarne的回答

let bar = t -> t^2
    global foo
    function foo(x)
        bar(x)
    end
end

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

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

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

注意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