【问题标题】:ruby pass-by-reference vs pass-reference-by-valueruby 按引用传递与按值传递引用
【发布时间】:2013-04-12 07:51:30
【问题描述】:

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

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(); 
}

在我看来,在这两种情况下,对象中包含的值都可以改变;但是,它的引用/指针不能。然而,我看到人们基于您无法更改引用指向的内容这一事实来区分按引用传递和按值传递引用。但是,如果没有指向指针的指针就无法做到这一点,我不明白为什么要进行这种区分。

在我看来,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

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

【问题讨论】:

  • 欺骗stackoverflow.com/questions/1872110/…。引用传递。
  • 请考虑 void f(int& i) { i = 6; } 和 def f(i); i = 6; end。
  • 我确实在我的问题中提到了另一个与我的问题相似的问题,但它并没有解决我看到的按引用传递与按值传递区别的区别由许多人制作。
  • 我认为您对选择不当的示例感到困惑。

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


【解决方案1】:

我不明白为什么会有这种区别。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2023-03-02
    • 2012-07-03
    • 1970-01-01
    • 2016-10-22
    • 2017-01-19
    相关资源
    最近更新 更多