为什么
1.equal? 1
== true 和 (2**100).equal? (2**100)
== false?
这可以被视为一个错误吗?
在我的 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?
来比较整数,而不是 ==
。