Monday, October 20, 2008

(19)Ruby中的对象

Ruby中一切都是对象,这里没有类似其他语言的原生类型和对象类型的区别,在Ruby中所有的对象都集成自Object。实际上当我们操作一个对象的时候我们实际上操作的是这个对象的引用,而不是对象本身,换句话说,当我们给一个变量赋值的时候我们并没有把值拷贝到这个变量“里边”,我们只是包存了一个引用到对象。如果你熟悉C或者C++你可以把对象引用理解为指针,但是Ruby其实没有实现指针。这里给出一些例子帮助我们理解对象引用:

s = "Ruby" # 创建一个字符串对象.  将一个引用存储到s.
t = s # 将这个引用拷贝给 t. 现在s和指向的是同一个引用.
t[-1] = "" # 通过对象t的引用修改这个对象.
print s # 通过 s访问这个已经更改的对象.打印值为 "Rub".
t = "Java" # 现在t指向另一个不同的引用.
print s,t # 打印结果为:"RubJava".


如果一个对象作为参数传递给一个方法,实际是传递的是对象的引用,而不是对象本身。更确切的说方法参数的传递是值传递而不是引用传递,但是这个是对象的引用。这句话说起来比较拗口,再举个例子,比如你传递一个对象x给方法,而你在方法内容对传入的参数就行了修改,那么对象x的引用也被修改了:


def modify(x) #参数是一个对象引用的值
x[0]="H"
end
z="hello"
y=modify(z)
puts z #z:Hello,值被改为了

因为你传递的是对象的引用,那么方法就可以利用这个引用修改底层的对象,这个修改操作发生在方法返回的时候。
我们说Ruby中所有的对象操作都是通过引用实现的,但是Fixnum和Symbol型的对象是“不可变对象”,而且这些对象中也没有定义“改变其自身”的方法,所以我们没法说着两个对象是值传递还是引用传递。
创建一个类的实例需要通过new方法,new方法分配一个实际的内存空间来存储这个对象。当你执行new操作的时候会调用对象的initialize方法,这个方法负责初始化对象。
myObject = myClass.new

Ruby中不存在类似C和C++中的析构函数,Ruby会在必要的时候自动进行垃圾对象的回收,垃圾回收是由Ruby内部控制的,当一个对象不再使用,或者没有被其他对象引用,它就会被Ruby作为垃圾对象回收。自动垃圾回收机制可以有效的避免由于忘记释放内存而造成的内存泄漏,但这也不能保证你的程序永远没哟内存泄漏,假如你对字典对象时候了缓存机制,而由没有实现类似“最近访问”算法,那么这个对象会一直存在,或者你把一个很长的自动对象定义为全局变量,那么这个对象会一直存在,知道你的Ruby解析器退出。

No comments: