为什么将小数与int进行比较成功?

时间:2014-09-23 02:31:10

标签: ruby

这令人困惑。为什么会这样?

2.0 == 2   # => true
2.0.eql? 2 # => false

2 个答案:

答案 0 :(得分:4)

因为ruby尝试使用==但不使用eql?进行类型转换

......和@sawa说的那样 - 如果不是我们可以选择的话,那将会很不方便。例如,将0.00进行比较非常有用,而且大多数情况下,无论对象是int还是小数,确实都不重要。 (30分钟与30.0分钟相同?我们是否关心最后有.0分钟?)

答案 1 :(得分:1)

数字类型转换和平等

你的问题是:

  

这令人困惑。为什么会这样?

2.0 == 2   # => true  
2.0.eql? 2 # => false

这是documented behavior

  

在Object级别,只有当obj和other是同一个对象时,==才返回true。通常,在子类中重写此方法以提供特定于类的含义...例如,数字类型跨==执行类型转换,但不跨eql执行类型转换?

文档甚至给出了这些例子来说明:

1 == 1.0     #=> true
1.eql? 1.0   #=> false

相比之下,Float#eql?说:

  

仅当obj是一个与float值相同的Float时才返回true。将此与Float#==进行对比,后者执行类型转换。