本帖最后由 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
慎点……
|