Ruby – 参考引用或值?

我不明白为什么他们说 Ruby按值传递所有参数,同时下面的代码certificate了相反:

class MyClass1 @var1 = 123 def get1 @var1 end def set1=value @var1 = value end end c1 = MyClass1.new c1.set1 = 444 p c1.get1 # 444 def test1 mc mc.set1 = 999 end test1 c1 p c1.get1 # 999 

如果它是按值计算的,它将打印出444而不是999

这个问题让人感到困惑,因为有一个叫做引用类型的东西,并且有一个名为pass-by-reference的东西,但它们实际上并没有那么多关于彼此的事情。

引用的引用,值和值:A(sorta)简要概述

在传递引用方案中,函数的参数是对传递给函数的变量的引用,修改参数会修改原始变量。 这不是Ruby的意思。 例如,让我们看看以下代码:

 def inc(val) val += 1 end a = 1 inc a puts a 

如果Ruby是一个传递引用语言,那么这个程序将打印2,因为incval += 1会增加a的值。 但事实并非如此。 变量val不是对变量a的引用 – 它是一个给定相同值的自变量。

“可是等等!” 你说。 “如果我们处理对象怎么办? 当然,对象变量是通过引用传递的 ,对吧?”

不。

 def change_string(str) str << " I can insult you all you want" str << " because you'll never see this" str << " because I'm going to replace the whole string!" str << " Haha you smell bad!" str = "What? I didn't say anything." # I'm so sneaky end be_nice_to_me = "hello" change_string(be_nice_to_me) puts be_nice_to_me 

如果Ruby是pass-by-reference,你永远不会看到change_string方法的意思,因为str = "What, I didn't say anything." 完全用字符串"What? I didn't say anything."取代be_nice_to_me的值"What? I didn't say anything." 但事实上, change_string的罪行是让所有人都看不到的。 如果Ruby没有通过引用传递,这怎么可能?

那么,还记得我之前谈过的那些参考类型吗? 嗯,这就是Ruby中的对象。 引用类型是一种类型,其值是对其他内容的引用。 在这种情况下,变量的值是对字符串"hello"的引用。 传递字符串时,变量的值(即引用)将复制到变量str 。 所以现在他们都持有对同一个对象的引用,但str不是对be_nice_to_me的引用。 因此,当您修改对象时,会显示这些更改,因为它们都指向同一个对象。 但是当你修改一个变量时,另一个变量看不到它,因为这两个变量都不是对另一个变量的引用

Ruby传递引用还是传值? 它是按值传递,但所有值都是引用。