Ruby函数是值传递还是引用传递?

浏览:3181 发布日期:2016-06-25 07:54:57

Ruby函数是值传递还是引用传递?

在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指向的字符串对象被改变了。