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对象。
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中操作的任何东西都是一个对象。