2015-04-27 58 views
2

我有一個類重寫self.new並調用超類,但類不是從antoher類派生的。那麼電話到底是什麼?ruby​​:調用超級沒有父類

class Test 
    attr_reader :blatt 

    def self.new(blatt, quellformat, &block) 
    begin 
     # why can't I call initialize(blatt,quellformat) here? 
     # when I try this, it only prints "wrong # of arguments(2 for 1)" 

     a = super(blatt, quellformat) # but this works... 

     # some code 
     a 
    end 
    end 

    def initialize(blatt, quellformat) 
    @name = blatt.blattname 
    @datei = blatt.datei 
    @blatt = blatt 
    @qu = quellformat 
    end 
end 
+0

'self.new'中的'begin'-'end'是什麼? –

+4

請勿重寫'self.new'。這是一個可怕的,可怕的想法。改用'initialize'。 –

+2

除了_must not_ override'self.new'之外,調用'initialize'將會調用類的函數,而不是實例。這聽起來像你絕對不明白你在做什麼。 – mudasobwa

回答

3

爲什麼我不能在這裏撥打initialize(blatt,quellformat)

因爲Test::new是一個類方法而Test#initialize是一個實例方法。你需要一個你的班級實例來呼叫initialize

通過定義self.new,您將替換Class#new。根據文檔:

調用allocate創建的類的一個新的對象,然後調用該對象的initialize方法,傳遞ARGS

一個Ruby實現應該是這樣的:

def self.new(*args) 
    obj = allocate 
    obj.send(:initialize, *args) 
    obj 
end 

調用super只是調用默認的實現,即Class#new,這不相同。這裏的C代碼:

VALUE 
rb_class_new_instance(int argc, const VALUE *argv, VALUE klass) 
{ 
    VALUE obj; 

    obj = rb_obj_alloc(klass); 
    rb_obj_call_init(obj, argc, argv); 

    return obj; 
} 
3

默認情況下,類繼承Object。因此,您的super電話將呼叫Object.new

+2

一般來說,這是不正確的。 'BasicObject'不從'Object'繼承。 – mudasobwa

+0

啊。好一個。不知道'對象'有父母。 – fylooi

+0

'▷Object.ancestors#⇒[Object,PP :: ObjectMixin,Kernel,BasicObject]' – mudasobwa