Why does Ruby have Numeric.new?

5
a = Numeric.new  # doesn't take an argument

我无法想象这个的使用场景。你能想到吗?


3
你的意思是 Numeric.new 而不是 Numeric#new.... # 表示“实例方法”(但在这种情况下,new 是一个类方法)。 - horseyguy
不知道。标题已更正。谢谢。 - steenslag
3个回答

3
Class 类定义了一个 new 实例方法。因此,Numeric 上的 new 类方法只是从那个方法继承下来的 - 它并没有做任何事情 - 就像动物从远古祖先那里继承下来的剩余器官一样(例如人类的阑尾)。
请注意,Numeric 的子类(例如 FixnumFloat 及其相关类)明确取消了 new 方法的定义。我猜他们只是没有费心为 Numeric 取消定义,因为这个类的直接实例从未真正存在过,并且保留它也不会造成任何伤害。

是的,那就是我发现的方式。在irb中尝试Float.new('NaN'),失败了(NoMethodError)。尝试Numeric.new("NaN")后,最终得到一个无用的(?)Numeric。 - steenslag

1

Ruby 中的所有东西都是对象,甚至包括类。因此,如果没有 Numeric 的构造函数,那么就根本不存在 Numeric 类!

看一下 文档。它只是一个基类。你永远不会(好吧,反正很少会)直接使用它。


2
这是错误的。许多Ruby类没有new方法,例如:TrueClass、FalseClass、NilClass、Fixnum、Float等。 - horseyguy
1
嗯,这只是一个小细节。如果需要,类可以取消定义其 new 方法。数字类型不会这样做,因为你应该能够将其作为基类进行子类化并使用它。而 TrueClass 等则不应该像这样使用。 - rfunduk
1
“细节问题”使得你的这个大胆陈述完全无效:“因此,如果Numeric没有构造函数,那么就根本不存在Numeric类!” - horseyguy
仅仅因为现在没有构造函数并不意味着它完全不可能存在。如果一个类没有构造函数,并且在树林里摔倒了,那么它会生成一个实例吗?也许我的回答有点“大胆”,但是...是的,TrueClass和NilClass都有构造函数,只是被明确地未定义了,而对于Numeric类型则没有。如果根本没有构造函数,那么这个类也就不存在了。 - rfunduk

1

你永远不会以那种方式使用数字类。它是 Ruby 中所有数字类型的基类。

Ruby 的数字类形成了一个完整的数字塔,提供了许多种数字和数值表示。

来源:Ruby 技巧:数字类


3
但是你没有解释为什么 new 仍然存在 :) - horseyguy

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