在Julia Lang
中,composite type
如何在运行时分配其参数值,并且文件中的所有函数都可以访问它们?
我正在寻找类似于Java中'static'关键字的功能。这是为了避免必须在每个函数调用中发送复合类型,因为它是从读取文件初始化一次并且许多函数依赖它;之后没有改变,但在编译时不知道这些值。 (我记得朱莉娅结构的用法,但我不确定这是否会改变任何东西)
答案 0 :(得分:2)
const
,那么它的类型可能不会改变(但它可能会绑定到一个值)。struct
s,元组,名为元组),则无法更改其值。但是,仍然可以将变量重新绑定到新值(只要新值具有适当的类型,我们将收到绑定已更改的警告 - 请参阅下面的示例)。 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
关键字:https://docs.julialang.org/en/latest/base/base/#global 编辑:在global
函数的定义中添加了缺少g
个关键字。