这个问题让人们感到困惑,因为有一种叫做引用类型的东西,还有一种叫做按引用传递的东西,但它们实际上并没有太多关系。
引用和值以及值是引用的概述:
在按引用传递的情况下,函数的参数是传递到函数中的变量的引用,并且修改参数会修改原始变量。Ruby不是这样的。例如,让我们看看以下代码:
def inc(val)
val += 1
end
a = 1
inc a
puts a
如果Ruby是一种传递引用的语言,那么这个程序将打印2,因为inc中的val += 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."
end
be_nice_to_me = "hello"
change_string(be_nice_to_me)
puts be_nice_to_me
如果 Ruby 是按引用传递的话,你永远不会看到
change_string
方法有多恶劣,因为
str = "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 是按值传递还是按引用传递?它是按值传递的,但所有的值都是引用。