2

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

Ruby 是按引用传递还是按值传递?

我的困惑是在 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

那么按引用传递和按引用传递值有什么区别呢?

4

1 回答 1

2

我不明白为什么要进行这种区分。

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

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

于 2013-04-19T09:43:51.427 回答