本帖最后由 garfeng 于 2016-7-18 15:16 编辑
我猜你想问10楼我问过的东西。
因为开辟了不一样的内存地址来存储实例,而在比较时,默认==符号比较的是地址的值,而非实例里的成员的具体值。
内存地址不一样了,所以会不是同一个东西。
个人理解所写,欢迎拍砖:
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
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
慎点……