我不明白为什么他们说 Ruby按值传递所有参数,同时下面的代码证明了相反的情况:
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
Run Code Online (Sandbox Code Playgroud)
如果按价值计算,它会打印出来444
,而不是999
.
Chu*_*uck 65
这个问题让人困惑,因为有一个叫做引用类型的东西,并且有一个叫做pass-by-reference的东西,但它们实际上并没有那么多关于彼此的事情.
在传递引用方案中,函数的参数是对传递给函数的变量的引用,修改参数会修改原始变量.这不是Ruby的意思.例如,让我们看看以下代码:
def inc(val)
val += 1
end
a = 1
inc a
puts a
Run Code Online (Sandbox Code Playgroud)
如果Ruby是一个传递引用语言,这个程序将打印2,因为val += 1
in inc
将增加值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
Run Code Online (Sandbox Code Playgroud)
如果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传递引用还是按值传递?它是按值传递,但所有值都是引用.