ruby pass-by-reference vs pass-reference-by-value

时间:2013-04-19 01:31:19

标签: c++ ruby pass-by-reference

来自沉重的C ++背景,我很难理解ruby函数参数是如何传递的,或者更确切地说,我很难理解pass-by-reference和pass-reference-by-value之间的语义差异这似乎是红宝石社区的区别。有很多资源在这个主题上有相互矛盾的信息(包括我在下面发布的这个网站,回复似乎差别很大)。

Is Ruby pass by reference or by value?

我的困惑在于C ++传递引用:

int function(Object& i)
{
    //cannot change the memory location of i in this function

    //only the value can change
    Object.param1 = 3;
}

或传递指针:

int function(Object* i)
{ 
    //this change will be visible in the calling function scope
    Object->param1 = 4;

    //this however will have no effect from the calling code
    i = new Object(); 
}

在这两种情况下,在我看来,Object包含的值可以改变;但是,它的引用/指针不能。然而,我看到人们根据您无法更改引用所指向的事实来区分传递引用和传递引用之间的区别。但是,如果没有指向指针的指针就不能这样做,我不明白为什么会这样区别。

在我看来,Ruby的行为方式相同:

class TestObject
    attr_accessor :param1

    def initialize()
        @param1 = 0
    end
end

def func(objtst)
    objtst.param1 = 12
end

obj_test = TestObject.new
puts obj_test.param1 #outputs 0
func(obj_test)
puts obj_test.param1 #now outputs 12

那么引用传递和引用传递值之间的区别是什么?

1 个答案:

答案 0 :(得分:2)

  

我不明白为什么会这样做。

这种区别是传递引用的本质。在第一个函数中,您可以对参数i = something进行简单的赋值,它将与调用范围中的赋值执行相同的操作。在第二个函数中,i = something永远不会对调用范围产生影响。事实上,在第二个函数中你没有什么可以做的,它具有与调用范围中的变量完全相同的语义。而已。这就是区别。

在Ruby(以及Python,Java和许多其他语言)中,分配给参数变量(使用=)从不会对调用范围产生影响。因此,它们是按价值传递的。