新手问题 Ruby 的对象引用让我糊涂了

w7938940 · 2013年03月08日 · 最后由 zw963 回复于 2013年03月09日 · 5469 次阅读

最近正在看《Ruby 编程语言》,里面一个对象引用的例子让我糊涂了,代码如下

s = "Ruby"
t = s
t[-1] = ""
print s  #这里是"Rub"
t = "Java"
print s,t #这里是“RubJava“

为什么上面改变 t 的时候 s 也发生了变化,而下面改变 t 时 s 没有发生变化?

书上还有一段极绕口的解释: 在 Ruby 中,当把一个对象传递给一个方法时,其实传递的是对该对象的引用,被传递的既不是对象本身,也不是一个指向该对象的引用的引用。换言之,方法实参是通过值而不是引用来传递的,只不过被传递的值正好是对象的引用。

t = s的时候 t 和 s 指向相同的内存地址 因此t[-1] = ""当然也会修改 s 的内容 然后t = "Java"的时候 t 指向"Java"所在的地址了 和 s 不再指向相同位置了 因此 s 不发生改变 以后对 t 的修改也不会导致 s 的变化了 很难理解嘛?

按照 C 的指针方式理解很简单

另外中文书一般不说人话的 哈哈

上面改的是实例的内容 下面改的是引用

#1 楼 @iBachue 那就是说通过 t[0, t.length-1] = "Java"t = "Java"是不同的?

#5 楼 @w7938940 是的 意思完全不同

#5 楼 @w7938940 另外一个经典案例就是 a = [1, 2, 3] 那么 a.clear 和 a = [] 的区别

#8 楼 @w7938940 你把 a 替换成 A 常量 就能看出区别大了

#9 楼 @iBachue 解释器会抛出一个警告:warning: already initialized constant A. 但是结果还是一样的

#10 楼 @w7938940 对的 这个警告就是区别

赋值的时候会重新分配内存给这个变量,而让两个变量相等是指向了同一块内存。如果两个变量用同一块内存,一变全变。

#11 楼 @iBachue 常量的例子太精辟了

#4 楼 @luikore 已经回答了...

不仅仅是 Ruby 是这样,C# 语言作为一门静态语言也是这样。这不是 Ruby 特有的问题...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号