A Ruby reference Example

简介:
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)

执行结果 : 
String
String
s1: Hello, I'm Digoal.Zhou
s2: Hello, I'm Digoal.Zhou
16581468
16581468
16581456
s1: uohZ.laogiD m'I ,olleH
s2: uohZ.laogiD m'I ,olleH
s3: Hello, I'm Digoal.Zhou
s1: Uohz.laogid m'i ,olleh
s2: Uohz.laogid m'i ,olleh
s3: Hello, I'm Digoal.Zhou
s1: hello, i'm digoal.zhoU. What's your name?
s2: hello, i'm digoal.zhoU. What's your name?
s3: Hello, I'm Digoal.Zhou
s1: DIG i'm digoal.zhoU. What's your name?
s2: DIG i'm digoal.zhoU. What's your name?
s3: Hello, I'm Digoal.Zhou
16581468
16581468
16581456

例如, Array类的对象也一样 :
a1 = Array.new([1,2,3,4,5])
a2 = a1
a3 = 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]
15533280
15533280
15533256
a1,["DIGOAL", 2, 3, 4, 5]
a2,["DIGOAL", 2, 3, 4, 5]
a3,[1, 2, 3, 4, 5]
15533280
15533280
15533256

但是需要注意的是, 如果前面例子中的s1不是通过!方法或<<连接的,(也就是不修改s1本身) . 而是通过赋值一个字符串(哪怕相同的字符串)或其他对象的话.
s1 的object_id将改变, 也就是说指向另一个值了, 但是s2还是指向原来的值. 我们来看个例子 :
s1 = "Hello, I'm Digoal. What's your name?"
s2 = s1
puts(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)

执行结果 : 
16121508
16121508
16121412
16121508
Hello, I'm Digoal. What's your name? Let's go.
Hello, I'm Digoal. What's your name?

但是对于Fixnum类的对象, 和Array,String类不太一样, 只要值相同, object_id就相同.
f1 = 10
f2 = f1
puts(f1.class)
puts(f2.class)
puts(f1.object_id)
puts(f2.object_id)
f1 = 10
puts(f1.object_id)
puts(f2.object_id)

执行结果 :
Fixnum
Fixnum
21
21
21
21

注意仅限于Fixnum, 新赋予的Float值相同, object_id也不同 .
f1 = 10.0
f2 = f1
puts(f1.class)
puts(f2.class)
puts(f1.object_id)
puts(f2.object_id)
f1 = 10.0
puts(f1.object_id)
puts(f2.object_id)

执行结果 :
Float
Float
16354536
16354536
16354128
16354536


目录
相关文章
|
安全 前端开发 C++
C++视角下的Qt按钮:从基础应用到高级定制(二)
C++视角下的Qt按钮:从基础应用到高级定制
796 2
|
小程序 数据处理
主流测绘仪器以及数据后处理软件教程
主流测绘仪器以及数据后处理软件教程
1171 1
|
5月前
|
API Windows 内存技术
OpenClaw 对接 DeepSeek 完整流程:从创建到测试图文版
本教程详解Windows版OpenClaw对接DeepSeek全流程:从账号实名认证、充值、创建API Key,到OpenClaw中粘贴密钥、测试连接、选择deepseek-chat等模型,图文并茂,零基础可快速完成本地大模型接入。
OpenClaw 对接 DeepSeek 完整流程:从创建到测试图文版
|
9月前
|
人工智能 搜索推荐
千问今天神级更新:全家桶一张嘴全搞定,手机App能删一半
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
千问今天神级更新:全家桶一张嘴全搞定,手机App能删一半
|
XML 传感器 网络协议
WebSocket与XMPP:即时通讯技术的本质区别与选择逻辑优雅草卓伊凡|片翼|许贝贝
WebSocket与XMPP:即时通讯技术的本质区别与选择逻辑优雅草卓伊凡|片翼|许贝贝
382 0
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
607 1
|
供应链 监控 Oracle
SCM供应链管理的核心要素及常用工具详解
理解供应链管理的7大关键要素,并借助专业的软件工具,企业可以更加高效地管理各个环节,提升整体运营效率。
2233 3
SCM供应链管理的核心要素及常用工具详解
|
监控 搜索推荐 BI
揭秘京东详情 API 接口:技术开发者的宝藏之门
京东详情API接口是开发者获取京东商品信息的高效工具,支持实时获取商品名称、价格、图片、参数及用户评价等多维度数据,具备准确、稳定、易集成等优势,广泛应用于比价平台、推荐系统等场景。
|
存储 关系型数据库 分布式数据库
PolarDB开源进阶篇:深度解析与实战优化指南
PolarDB是阿里云开源的云原生数据库,采用计算-存储分离架构,结合高性能共享存储与Parallel Raft多副本一致性协议,实现微秒级延迟和卓越性能。本文深入解析其架构设计,涵盖智能调度层、性能优化技巧(如查询优化器调优和分布式事务提升)、高可用与容灾配置、扩展功能开发指南以及监控运维体系。同时,通过电商平台优化案例展示实际应用效果,并展望未来演进方向,包括AI结合、多模数据库支持及Serverless架构发展。作为云原生数据库代表,PolarDB为开发者提供了强大支持和广阔前景。
786 16
|
安全 IDE Java
Kotlin学习教程(四)
数据类:使用data class定义 数据类是一种非常强大的类。在Kotlin学习教程(一)中最开始的用的简洁的示例代码就是一个数据类。这里我们再拿过来:
520 2