2010-10-04 37 views
5
a = Numeric.new # doesn't take an argument 

我無法想象這個用例。你可以嗎?爲什麼Ruby有Numeric.new?

+3

你的意思是'Numeric.new'不是'Numeric#new' ....''''表示'實例方法'(但在這種情況下'new'是一個類方法) – horseyguy 2010-10-05 04:48:00

+0

不知道。標題已更正。謝謝。 – steenslag 2010-10-05 06:35:02

回答

3

Class類定義了一個new實例方法。因此,上的new類方法僅僅是一種保留 - 它沒有做任何事情 - 把它看作是動物從遠古祖先繼承的退化器官之一 - 就像人類的闌尾一樣。

注意的諸如NumericFixnumFloat及其親屬顯式取消定義的new方法的子類。我想他們只是沒有打擾到它對於Numeric的定義,因爲這個類的直接實例從來沒有真正存在過,並且它沒有傷害它。

+0

是的,這就是我發現的原因。在irb中玩,嘗試Float.new('NaN'),失敗(NoMethodError)。去Numeric.new(「NaN」),最後是一個無用的(?)數字。 – steenslag 2010-10-05 06:48:39

1

Ruby中的所有東西都是對象,甚至是類。所以沒有Numeric的構造函數意味着根本沒有Numeric類!

看看the docs。它只是一個基類。你永遠不會(好吧,它不太可能,無論如何:))直接使用它。

+2

這是錯誤的。許多Ruby類沒有'new'方法,請參閱:TrueClass,FalseClass,NilClass,Fixnum,Float等 – horseyguy 2010-10-05 04:13:13

+1

Eh,一個小細節。如果需要,一個類可以取消定義它的'new'方法。數字不是因爲你的意思是能夠繼承它並將其作爲一個基礎。 「TrueClass」等並不意味着要這樣使用。 – rfunduk 2010-10-05 11:44:07

+1

'小細節'使你的這個粗體聲明完全無效:「所以沒有Numeric的構造函數意味着根本沒有Numeric類!」 – horseyguy 2010-10-05 19:21:43

1

您將永遠不會以這種方式使用數字類。它是Ruby中所有數字類型的基類。

Ruby的數值類構成一個完整的 數字塔,提供多種數字 表示和 數值表示。

來源:Ruby Tips: Numeric Classes

+3

但你沒有解釋爲什麼'new'仍然存在:) – horseyguy 2010-10-05 04:37:37