Ruby变量

每个变量保存一个对象的引用。

person = "Tim"

person.object_id       ->938678

person.class             ->String

person                     ->"Tim"

第一行代码,Ruby使用值“Tim”创建了一个String对象。这个对象的一个引用(reference)被保存在局部变量person中。接下去的快速检查展示了变量具备字符串的特性,它具有对象的ID,类和值。

那么,变量是一个对象吗?在Ruby中,答案是“不”,变量只是对象的引用。对象漂浮在某处一个很大的池中(大多数时候是堆,即heap中),并由变量指向它们。

person1 ="Tim"

person2 =person1

person1[0] = 'J'

person1                ->"Jim"

person2                ->"Jim"

我们改变了person1的第一个字符,但是person1和person2都从“Tim”改为了“Jim”.

这都归结于变量保存的是对象引用而非对象本身这一事实。将person1赋值给person2并不会创建任何新的对象;它只是将person1的对象引用拷贝给person2,因此person1和person2都指向同一个对象。

赋值别名(alias)对象,潜在地给了你引用同一对象的多个变量。你可以通过使用String的dup方法来避免创建别名,它会创建一个新的、具有相同内容的String对象。

View Code
1 person1 = "Tim"
2 person2 = person1.dup
3 person1[0] = "J"
4 person1              ->"Jim"
5 person2              ->"Tim"

你可以通过冻结一个对象来阻止其他人对其进行改动。试图更改一个被冻结的对象,Ruby将引发(raise)一个TypeError异常。

person1 = "Tim"
person2 = person1
person1.freeze   #prevent modifications to the object
person2[0] ="J"

 输出结果:

prog.rb:4:in '[]=':can't modify frozen string (TypeError)
from prog.rb.4

 在Ruby中操作的任何东西都是一个对象。

 

posted on 2012-07-15 14:41  tim_sheng  阅读(403)  评论(0编辑  收藏  举报

导航