如何在Julia-lang中初始化复合类型并且可以访问所有函数而不将其作为函数参数传递?

时间:2018-02-18 03:33:55

标签: julia

Julia Lang中,composite type如何在运行时分配其参数值,并且文件中的所有函数都可以访问它们?

我正在寻找类似于Java中'static'关键字的功能。这是为了避免必须在每个函数调用中发送复合类型,因为它是从读取文件初始化一次并且许多函数依赖它;之后没有改变,但在编译时不知道这些值。 (我记得朱莉娅结构的用法,但我不确定这是否会改变任何东西)

1 个答案:

答案 0 :(得分:2)

  1. 在Julia中,您可以定义全局变量。每个Julia模块(或裸模块)都有其全局范围。 如果声明一个全局变量const,那么它的类型可能不会改变(但它可能会绑定到一个值)。
  2. 你问题的第二部分是这种全球常数的可变性。如果全局常量变量的类型是不可变的(例如数字,字符串,struct s,元组,名为元组),则无法更改其值。但是,仍然可以将变量重新绑定到新值(只要新值具有适当的类型,我们将收到绑定已更改的警告 - 请参阅下面的示例)。
  3. Julia Base中这种方法的一个很好的例子是Base.GLOBAL_RNG变量(除了它是可变的) - 它在Julia中保持默认随机数生成器的状态。

    以下是使用struct的简单示例:

    module E
    
    struct A # immutable
        x::Int
    end
    
    const a = A(1) # global constant in module E
    
    f() = println("a: $a")
    
    function g()
         global a = A(10) # rebinding of a global variable requires global keyword
    end
    
    function h()
        a.x = 100
    end
    
    end # module
    

    如果在REPL中执行此操作,则可以测试行为:

    julia> E.a # we test the value of a global variable in module E
    Main.E.A(1)
    
    julia> E.f() # function f() from this module can access it
    a: Main.E.A(1)
    
    julia> E.h() # we cannot mutate fields of a
    ERROR: type is immutable
    Stacktrace:
     [1] setproperty! at .\sysimg.jl:9 [inlined]
     [2] h() at .\REPL[1]:16
     [3] top-level scope
    
    julia> E.g() # but we can change the binding, we get a warning
    WARNING: redefining constant a
    Main.E.A(10)
    
    julia> E.a
    Main.E.A(10)    
    
    julia> E.a = E.A(1000) # the binding cannot be changed outside the module
    ERROR: cannot assign variables in other modules
    Stacktrace:
     [1] setproperty!(::Module, ::Symbol, ::Main.E.A) at .\sysimg.jl:15
     [2] top-level scope
    

    如果在REPL中定义全局常量,则重新绑定其值会另外发出警告(这里是一些在REPL范围中定义的全局变量的示例):

    julia> global const z = E.A(5)
    Main.E.A(5)
    
    julia> z.x = 10
    ERROR: type A is immutable
    Stacktrace:
     [1] setproperty!(::Main.E.A, ::Symbol, ::Int64) at .\sysimg.jl:9
     [2] top-level scope
    
    julia> z = E.A(2)
    WARNING: redefining constant z
    Main.E.A(2)
    
    julia> z = "test" # we cannot change a type of const variable
    ERROR: invalid redefinition of constant z
    

    以下是Julia手册的相关章节:

    编辑:在global函数的定义中添加了缺少g个关键字。