是全球性的,还是不是
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
地方与它无关;通过引用是关于值,而不是名称。 (另外,你甚至没有遮挡任何东西。)
在 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
地方与它无关;通过引用是关于值,而不是名称。 (另外,你甚至没有遮挡任何东西。)