为什么使用`1.0 / 0`而不是`Float::INFINITY`?

3
我阅读了由知名的Ruby开发者编写的gem rom,尤其是它的子模块rom-relation。在rom-relation/lib/rom-relation.rb中,我们可以看到以下内容:
#Represent a positive, infinitely large Float number
Infinity  = 1.0 / 0

但我没有看到使用Float::INFINITY的任何用处。

在irb中,我尝试了:

> 1.0/0 == Float::INFINITY
=> true
  • 为什么不使用Float::INFINITY
  • Infinity以大写字母开头,是一个常数,但为什么不使用INFINITY?(即,这里使用了什么约定?)

"INFINITY" 以大写字母开头。 - sawa
如果我说我的母语不是英语,因此我并不精通所有的英语语言,那么我会被原谅吗? - Hettomei
2
为什么有这么多的Downvote和Closevote?这是一个合理的问题。 - Stefan
2
@Stefan:嗯,很难给出客观、明确的答案——除了作者之外,没有人能真正说出他们为什么这样做。这可能解释了投票结果。 - Jon Skeet
2个回答

8

Jon已经说过,Float::INFINITY是在Ruby 1.9.2中引入的。因此,如果ROM使用这个常量,它将需要Ruby 1.9.2。

另一方面,1.0/0适用于每个Ruby版本。

然而,你当然可以在你的代码中使用Float::INFINITY

ROM::Infinity == Float::INFINITY
#=> true

2
也许这段代码是在 Float::INFINITY 出现之前编写的?我看它好像是在 Ruby 1.9.2 中引入的:1.9.1 文档1.9.2 文档。快速搜索一下网络,Ruby 是在 2010 年 8 月推出的。虽然你正在查看的特定文件非常新,但我怀疑这段代码是从旧版本中复制过来的。
(我无法对命名进行评论。看上下文,已经有混合了。)

1
使用 Git,我可以看到代码的一部分是: 作者:Piotr Solnica piotr.solnica@gmail.com 日期:2013年6月4日星期二+0200 我无法相信它是在2010年8月之前编写的。 - Hettomei
@Hettomei:正如我在答案中所说,我怀疑它是从某个旧地方复制过来的。为什么你不能相信那行代码在2010年8月之前就已经被写出来了呢?Ruby已经存在很长时间了,人们经常从一个地方复制一些代码到另一个地方。 - Jon Skeet
可能是代码试图保持向后兼容性,或者作者并不知道Float::INFINITY已经被添加了,并坚持使用他知道的技巧。 - Martijn Pieters
不确定Ruby生态系统的情况,但许多Python库开发人员仍然支持Python 2.6;2.7于2010年7月发布。许多LTS Linux发行版仍然捆绑2.6。 Ruby可能面临着相同的情况,因此支持1.9.2版本仍然是有意义的。 - Martijn Pieters
我“无法相信”,因为“Rom”是一个新的宝石,旨在替代Datamapper,此外,我从“piotr solnica”的演示中看到了非常好的表现,所以我天真地认为这段代码是有充分理由编写的。向后兼容性,为什么不呢,但是:一个.ruby-version指定1.9.3,并且“Infinity”在4个模块中都没有使用。也许你是对的,我应该直接询问作者。 - Hettomei
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接