a = A.new
b = a
Addr Data 这是一个内存条
+---+-------+
a ---------> | 1 | 3 |-------+
+---+-------+ |
b ---------> | 2 | 3 |----+ |
+---+-------+ | |
| 3 | |<---+--+
+---| Obj1 |
| 4 | |
+---+-------+
|...| ..... |
+---+-------+
a = A.new
申请3~4的内存,吧Obj1存进去,将a赋值3
a --> Addr:1 --> Data:3 --> Addr:3 --> Obj1
b = a
b --> Addr:2 --> Data:3 --> Addr:3 --> Obj1
a和b都是3,所以
a==b # =>>true
a equal? b # =>> true
a eql? b # =>> true
==========================================================================
a = A.new
b = A.new
Addr Data 这是一个内存条
+---+-------+
a ----------> | 1 | 3 |----+ a存储的内容是3,即obj1的起始地址位
+---+-------+ | ---------------------------------------
b ----------> | 2 | 5 |----+--+ b存储的内容是5,即obj2的起始地址位
+---+-------+ | | -------------------------------------
| 3 | |<---+ |
+---+ Obj1 | | 3,4号地址位里存储的内容obj1,和
| 4 | | | 5,6号里存储的obj2一模一样。
+---+-------+ | 假设hash也一样?
| 5 | |<------+
+---+ Obj2 |
| 6 | |
+---+-------+
当使用a所代表的object时,访问顺序:
a --> Addr:1 --> Data:3 --> Addr:3 --> Data:Obj1
b --> Addr:2 --> Data:5 --> Addr:5 --> Data:Obj2
a是3,而b是5,所以
a==b #=>>false
a equal? b # =>> false
a eql? b # =>> true
=====================================================================
涉及到哈希值的比较?
a = A.new
b = a.dup
+---+--------+
a ---------> | 1 | 3 |----+
+---+--------+ |
b ---------> | 2 | 5 |----+---+
+---+--------+ | |
| 3 | Obj1 |<---+ |
+---+ hash1 | | hash1 和hash2 不一样,
| 4 | | | 除此之外,Obj1和Obj2的
+---+--------+ | 其他内容都一样?
| 5 | Obj2 |<-------+
+---+ hash2 |
| 6 | |
+---+--------+
a==b #=>>false
a equal? b =>> false
a eql? b =>> false