2009-07-08 47 views
7

所以我明白你不應該直接子類爲Fixnum,Float或Integer,因爲它們沒有#new方法。使用DelegateClass似乎工作,但它是最好的方式?任何人都知道這些類沒有#new的原因是什麼?紅寶石子類別Fixnum

我需要它的行爲像一個Fixnum,但有一些額外的方法類,我想能夠通過self從類中引用它的值,例如:

class Foo < Fixnum 
    def initialize value 
    super value 
    end 

    def increment 
    self + 1 
    end 
end 

Foo.new(5).increment + 4 # => 10 
+0

告訴我們你真正想要做什麼(最終目標),我們會盡力告訴你最好的方法。我不認爲在這裏分類是合適的。 – 2009-07-08 02:05:51

+0

更新了問題。 – cloudhead 2009-07-08 02:12:34

回答

17

你可以很容易地建立一個快速轉發實現自己:

class MyNum 
    def initialize(number) 
    @number = number 
    end 

    def method_missing(name, *args, &blk) 
    ret = @number.send(name, *args, &blk) 
    ret.is_a?(Numeric) ? MyNum.new(ret) : ret 
    end 
end 

然後你就可以添加你想要的任何myNum的方法,但是你需要在這些方法上@number操作,而不是能夠直接呼叫超級。

2

你不能擴展FixNum本身嗎?像...

class Fixnum 
    def even? 
    self % 2 == 0 
    end 
end 

42.even? 
+1

我可以,但我寧願不。此外,Fixnum沒有#new,我需要能夠爲#initialize添加功能。 – cloudhead 2009-07-08 02:19:49

+1

應該小心使用猴子修補。污染Ruby核心類只是爲了特定用例,可能會很危險。 – 2014-01-15 14:52:44

4

IIRC,主要的Ruby實現門店Fixnums作爲直接值的,使用一些字的低位,以它作爲標記一個Fixnum,而不是一個指向堆上的對象。這就是爲什麼在32位機器上,Fixnums只有29位(或其它),而不是全字。

因此,您不能將方法添加到Fixnum的單個「實例」中,並且無法對其進行子類化。

如果你對具有「Fixnum -like」類的問題已經死氣沉沉,那麼你可能必須創建一個具有Fixnum實例變量的類,並適當地轉發方法調用。