来自深厚的 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/