c++ - ruby 按引用传递与按值传递引用

标签 c++ ruby pass-by-reference

来自深厚的 C++ 背景,我很难理解 ruby​​ 函数参数是如何传递的,或者更确切地说,我很难理解按引用传递和按值传递引用之间的语义差异这似乎是 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

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

最佳答案

I do not understand why this distinction is made.

这种区别是引用传递的本质。在第一个函数中,您可以对参数进行简单的赋值:i = Something,它将执行与调用范围中的赋值相同的操作。在第二个函数中,i = Something 永远不会对调用范围产生影响。事实上,在第二个函数中您无法执行任何与调用作用域中的变量赋值完全相同的语义。就是这样。这就是区别。

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

关于c++ - ruby 按引用传递与按值传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16095820/

相关文章:

c++ - 如何要求 stringstream 不要在引号中拆分数据 (C++)

c++ - 部分透明窗口 OpenGL/Win32

c++ - 使用从未打算在常量表达式中使用的 constexpr 变量是否有好处?

python - C 或 C++ 中是否存在常见数学运算(例如最小值、最大值和平均值)的可导入库?

ruby - Ruby 中有条件的内联和有条件的 block 之间的区别

c++ - 将 C++ out 引用分配给被破坏的东西?

ruby - 模块的实例变量是否在类与 mixin 之间共享?

ruby - 如何在 Ruby 的 IRB 中启用自动完成

c++ - 为什么 const 变量不能通过引用传递?

python - 通过引用改变 python 传入对象