在Java,JavaScript等语言的实现中,函数都是值传递的,Ruby也不例外,要证明这一点,请看下面的例子:
h = {a: 3} def ss(a) a[:a] = 4 end p h #输出结果为 {a: 4}
这是因为Hash对象是一个引用,形参a只是复制了h指向对象的引用,由于h和a指向同一个对象,所以对象被改变了。
h = {a: 3} def ss(a) a = {a: 4, b: 3} end p h #输出为{a: 3}
这里改变了实参a的指向,h指向的对象并未改变,由此可见,Ruby的函数和Java、JavaScript一样,是按值传递的。
再来看看容易让人迷惑的String对象做参数的问题,例如:
s = "aa" def ss(a) a = "bb" end ss(s) p s # 输出"aa"
s指向的字符串没有被改变,因为a = "bb",其实是为形参a创建了一个新的字符串,例子2:
s = "aa" def ss(a) a << "bb" end ss(s) p s # 输出"aabb"
我们在ss函数内直接对a进行操作,这次s指向的字符串对象被改变了。