Ruby:整数对象标识的差异

问题描述 投票:0回答:1

为什么

1.equal? 1
== true
(2**100).equal? (2**100)
== false

这可以被视为一个错误吗?

ruby integer immutability
1个回答
0
投票

在我的 ruby 版本上似乎是截止点:

(2**62 - 1).equal?(2**62 - 1) #=> true
(2**62).equal?(2**62) #=> false

我预计这在 ruby 实现/安装之间会有所不同。

这样做的原因是

.equal?
正在比较对象同一性——这是比
==
的标准“值同一性”更严格的相等性检查。例如:

:test.equal?(:test) #=> true
# Because :test.object_id == :test.object_id
# i.e. It's exactly the same object every time

"test".equal?("test") #=> false
# Because "test".object_id != "test".object_id
# i.e. It's a different object each time. Note that strings in ruby are mutable!

回到整数的例子:

0.object_id == 1
1.object_id == 3
2.object_id == 5
# ...
(2**62 - 1).object_id == 9223372036854775807
(2**62).object_id == 300 # Or whatever. A different number each time!

...所以超过一定的限制,Ruby 似乎正在为该值分配“自定义对象 ID”,而不是一个定义明确的常量,或者像

Symbol
s 那样的重复使用的引用。

这是一个错误吗?或许。但我不知道为什么你首先要使用

.equal?
来比较整数,而不是
==

© www.soinside.com 2019 - 2024. All rights reserved.