【问题标题】:to be global, or not to be [duplicate]是全球性的,还是不是[重复]
【发布时间】:2021-06-30 11:14:55
【问题描述】:

在 Julia 1.6.1 [VScode 1.57.1​​ with 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() “按值”,当然,不是“按引用”——正如帕斯卡人所说的那样 p>

但是g2 不是吗?但那究竟是什么?

从功能上讲,它很可能是一个“全局”变量(虽然没有这样声明,并且如果它是一个全局变量,那么函数中无论如何都需要“全局”声明。没关系)。 没关系本地/全球,set_g2 在任何情况下都通过引用作用于g2 - 有效。

'逻辑光学',可以这么说,这里患了近视?

但是,我是近视的,所以也许是我.. 然后一个人必须忍受自己的缺陷,'试图应对,而这种'通过参考'-行为确实派上用场(鉴于我必须应对-虽然有点不喜欢- - 加载全局变量)

但是我不知道如何将g1 传递给set_g1() '通过引用' [仍然喜欢那种过时的 Pascal 方法;但是传递 var 然后,一旦功能消化,返回它,从视觉上看起来不是很短视,它看起来有点笨拙]

【问题讨论】:

    标签: julia global-variables pass-by-reference global


    【解决方案1】:

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

    “通过引用”就像:你给我一个苹果;我又拿了一个苹果还给你。不过,set_g2 发生的事情是:你给我一盒苹果。我换了一个苹果,把盒子还给你。我没有换盒子。

    可以通过引用传递值,不过,通过将它们包装在 Ref 类型中(其行为类似于零级数组,几乎类似于指针):

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

    地点与它没有任何关系;引用是关于值,而不是名称。 (另外,你甚至没有遮蔽任何东西。)

    【讨论】:

    • 感谢您的评论。特别是你的包装提示对我很有帮助。
    猜你喜欢
    • 2016-06-20
    • 2011-12-05
    • 1970-01-01
    • 2011-03-26
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多