是全球性的,还是不是

to be global, or not to be

在 Julia 1.6.1 [VScode 1.57.1​​ 和 Julia Extension 1.2.5] 中: 两个简单的函数,两个变量,一个是 g1({Int64} 类型),另一个是 g2(显然是 Vector{Int64} 类型)。完整的普鲁斯特规模的极其详尽的代码是:

function set_g1(_a)
    _a = 0
end

function set_g2(_a)
    _a[length(_a)] = _a[begin]
end

g1 = 279
g2 = [1, 2, 3, 4]

set_g1(g1)
set_g2(g2)

println(g1)
println(g2)

-- 输出:

279
[1, 2, 3, 1]

就是这样。 g1 仅传递给 set_g1() 'by value',当然不会传递给 'by reference' -- 正如 Pascal'ians 所说

g2 不是吗?但它到底是什么?

从功能上讲,它很可能是一个 'global' 变量(虽然没有这样声明,但如果它是一个全局变量,函数中无论如何都需要 'global' 声明。它不是没关系)。 没关系 local/gobal,set_g2 在任何情况下都通过引用作用于 g2——实际上。

'logical optics',这么说来,这里患上近视了?

然而,我是近视的所以也许是我.. 然后一个人必须忍受自己的缺陷,' 试图应对这种 'by reference'-行为确实派上用场(考虑到我必须处理 - 虽然不喜欢有点——大量的全局变量)

但后来我不知道如何将 g1 传递给 set_g1() 'by reference' [仍然喜欢那种过时的 Pascal 方法;但是传递 var 然后,一旦功能消化,返回它,visuo-logically 看起来不太近视,它看起来有些笨拙]

set_g2 在您的术语中“通过引用”工作,不。在函数体中,您没有更改 _a -- 您正在更改其内容。

“引用”就像:你给我一个苹果;我拿另一个苹果还给你。但是,set_g2 中发生的事情是:你给我一盒苹果。我换一个苹果,把盒子还给你。我没换盒子

可以 通过引用传递值,但是,通过将它们包装在 Ref 类型中(它的行为就像一个零阶数组,几乎像一个指针):

function set_g1!(_a::Ref{Int})
    _a[] = 0
end

g1 = Ref(234)
set_g1(g1)
@assert g1[] == 0

地方与它无关;通过引用是关于值,而不是名称。 (另外,你甚至没有遮挡任何东西。)