这令人困惑。为什么会这样?
2.0 == 2 # => true
2.0.eql? 2 # => false
答案 0 :(得分:4)
因为ruby尝试使用==
但不使用eql?
进行类型转换
......和@sawa说的那样 - 如果不是我们可以选择的话,那将会很不方便。例如,将0.0
与0
进行比较非常有用,而且大多数情况下,无论对象是int还是小数,确实都不重要。 (30
分钟与30.0
分钟相同?我们是否关心最后有.0
分钟?)
答案 1 :(得分:1)
你的问题是:
这令人困惑。为什么会这样?
2.0 == 2 # => true 2.0.eql? 2 # => false
在Object级别,只有当obj和other是同一个对象时,==才返回true。通常,在子类中重写此方法以提供特定于类的含义...例如,数字类型跨==执行类型转换,但不跨eql执行类型转换?
文档甚至给出了这些例子来说明:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
相比之下,Float#eql?说:
仅当obj是一个与float值相同的Float时才返回true。将此与Float#==进行对比,后者执行类型转换。