博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A Ruby reference Example
阅读量:6082 次
发布时间:2019-06-20

本文共 2741 字,大约阅读时间需要 9 分钟。

object_id在Ruby中通常用于判断两个对象是不是一个物理上的东西.
object_id相同的对象可以理解为它们都指向了同一个值.
例如,String类的对象 :
s1 = %Q/Hello, I'm Digoal.Zhou/s2 = s1  # 把一个String对象赋值给另一个对象, 其实是一次reference赋值s3 = s1.clone()  # 使用clone()方法则不是reference操作, 而是重新创建了一个对象.puts(s1.class)puts(s2.class)puts("s1: #{s1}")puts("s2: #{s2}")puts(s1.object_id) # 看看这三个对象的object_id就知道了.puts(s2.object_id)puts(s3.object_id)s1.reverse!puts("s1: #{s1}")  # 修改s1 后 , s2其实也修改了, 因为它们执行同一个值.puts("s2: #{s2}")puts("s3: #{s3}")  # 显然s3是另一个对象, 修改s1,s2对它没反映.s2.capitalize!puts("s1: #{s1}")puts("s2: #{s2}")puts("s3: #{s3}")s1.reverse! << '. What\'s your name?'puts("s1: #{s1}")puts("s2: #{s2}")puts("s3: #{s3}")s2[0,6] = 'DIG'  # 这是修改从0号index开始的6个字符.即"hello,"改为"DIG"puts("s1: #{s1}")puts("s2: #{s2}")puts("s3: #{s3}")puts(s1.object_id)puts(s2.object_id)puts(s3.object_id)
执行结果 : 
StringStrings1: Hello, I'm Digoal.Zhous2: Hello, I'm Digoal.Zhou165814681658146816581456s1: uohZ.laogiD m'I ,olleHs2: uohZ.laogiD m'I ,olleHs3: Hello, I'm Digoal.Zhous1: Uohz.laogid m'i ,ollehs2: Uohz.laogid m'i ,ollehs3: Hello, I'm Digoal.Zhous1: hello, i'm digoal.zhoU. What's your name?s2: hello, i'm digoal.zhoU. What's your name?s3: Hello, I'm Digoal.Zhous1: DIG i'm digoal.zhoU. What's your name?s2: DIG i'm digoal.zhoU. What's your name?s3: Hello, I'm Digoal.Zhou165814681658146816581456
例如, Array类的对象也一样 :
a1 = Array.new([1,2,3,4,5])a2 = a1a3 = a1.clone()print("a1,#{a1}\n")print("a2,#{a2}\n")print("a3,#{a3}\n")puts(a1.object_id)puts(a2.object_id)puts(a3.object_id)a1[0] = "DIGOAL"print("a1,#{a1}\n")print("a2,#{a2}\n")print("a3,#{a3}\n")puts(a1.object_id)puts(a2.object_id)puts(a3.object_id)
执行结果 : 
a1,[1, 2, 3, 4, 5]a2,[1, 2, 3, 4, 5]a3,[1, 2, 3, 4, 5]155332801553328015533256a1,["DIGOAL", 2, 3, 4, 5]a2,["DIGOAL", 2, 3, 4, 5]a3,[1, 2, 3, 4, 5]155332801553328015533256
但是需要注意的是, 如果前面例子中的s1不是通过!方法或<<连接的,(也就是不修改s1本身) . 而是通过赋值一个字符串(哪怕相同的字符串)或其他对象的话.
s1 的object_id将改变, 也就是说指向另一个值了, 但是s2还是指向原来的值. 我们来看个例子 :
s1 = "Hello, I'm Digoal. What's your name?"s2 = s1puts(s1.object_id)puts(s2.object_id)s1 = "Hello, I'm Digoal. What's your name?"  # 虽然这里赋予了相同的值, 但是实际上是新产生了一个对象ID.puts(s1.object_id)puts(s2.object_id)s1 << " Let's go."  # 所以对s1改变时, s2不会受到影响. 因为它们指向的不是一个值了.puts(s1)puts(s2)
执行结果 : 
16121508161215081612141216121508Hello, I'm Digoal. What's your name? Let's go.Hello, I'm Digoal. What's your name?
但是对于Fixnum类的对象, 和Array,String类不太一样, 只要值相同, object_id就相同.
f1 = 10f2 = f1puts(f1.class)puts(f2.class)puts(f1.object_id)puts(f2.object_id)f1 = 10puts(f1.object_id)puts(f2.object_id)
执行结果 :
FixnumFixnum21212121
注意仅限于Fixnum, 新赋予的Float值相同, object_id也不同 .
f1 = 10.0f2 = f1puts(f1.class)puts(f2.class)puts(f1.object_id)puts(f2.object_id)f1 = 10.0puts(f1.object_id)puts(f2.object_id)
执行结果 :
FloatFloat16354536163545361635412816354536

转载地址:http://qouwa.baihongyu.com/

你可能感兴趣的文章
前端基础---jquery练习
查看>>
保持健康,远离疾病
查看>>
如何推断乱码是从何种编码转换到何种编码导致的乱码?
查看>>
Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
查看>>
【SMTP 补录】
查看>>
zabbix通过External checks的方式自动发现交换机端口(只提取up的)
查看>>
CentOS下配置LAMP
查看>>
Myeclipse报错-->Animation Start An internal error has occurred. java.lang.NullPointerException解决...
查看>>
CSS性能优化
查看>>
C# 流
查看>>
查杀端口进程
查看>>
PHP版本的IP段验证类
查看>>
openstack M版安装 compute(nova)服务篇
查看>>
大学四年你必须做到的事儿---那些学计算机的
查看>>
rlwrap安装
查看>>
【scala初学】scala IDE eclipse
查看>>
VMM2012应用指南之4-向VMM中添加Hyper-V主机与应用服务器
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
perl文件读写
查看>>