Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 1.1.1-绝对全局变量_Julia - Fatal编程技术网

Julia 1.1.1-绝对全局变量

Julia 1.1.1-绝对全局变量,julia,Julia,我来自Fortran,在整个程序中使用全局数据向量。通常我声明一个模块: module xyz real, allocatable :: vector(:,:,:) ! a 3 dim vector, undefined end module 现在,在某个地方,比如子例程函数A,我为它分配内存并初始化为一些值: allocate(vector(10,20,30)) vector = ran() 现在,在程序子程序或函数B、C、D的任何其他单元中,如果我

我来自Fortran,在整个程序中使用全局数据向量。通常我声明一个模块:

module xyz   
     real, allocatable :: vector(:,:,:)   ! a 3 dim vector, undefined    
end module  
现在,在某个地方,比如子例程函数A,我为它分配内存并初始化为一些值:

allocate(vector(10,20,30))    
vector = ran()
现在,在程序子程序或函数B、C、D的任何其他单元中,如果我使用模块,即:

using xyz
上面声明的向量是可用的


我无法在新的技术奇迹Julia 1.1中获得这种行为。作用域规则令人头痛。

在Julia中,详细解释了从其他模块访问变量的规则

在您的情况下,关键问题如下:

仅当变量在模块中导出时,变量在使用后才可见 您可以访问其他模块中的变量 不允许从其他模块重新绑定变量 这意味着全局变量绑定创建操作是模块专用的

下面是一个简单的模块定义示例:

module M

export x

x = Int[]

function rebindx()
    global x = Int[]
end

end
现在假设您在REPL中定义并稍后使用它,它可以是任何其他模块

julia> module M

       export x

       x = Int[]

       function rebindx()
           global x = Int[]
       end

       end
Main.M

julia> using .M
现在您可以访问x:

但不是重新绑定x:

但是,您可以调用M模块中定义的函数来更改x的绑定,如下所示:

julia> x
1-element Array{Int64,1}:
 10

julia> M.rebindx()
0-element Array{Int64,1}

julia> x
0-element Array{Int64,1}

这是可能的,因为rebindx是在模块M中定义的,因此它有权更改此模块中定义的变量x的绑定。

如果解释清楚,请告诉我;如果不是的话,我可以详细介绍一下。请注意有,所以你可能想探索一种不同的方法。博古米尔-谢谢你的帮助。阅读文档和用手操作是不同的。我发现我需要在定义模块中同时使用export和global,以便使变量普遍可用。
julia> x = 0
ERROR: cannot assign variable M.x from module Main
julia> x
1-element Array{Int64,1}:
 10

julia> M.rebindx()
0-element Array{Int64,1}

julia> x
0-element Array{Int64,1}