2015-04-27 1 views
2

У меня есть класс, который переопределяет self.new и вызывает super в нем, но класс не получается из класса antoher. Так что же такое призыв?ruby: вызов super без родительского класса

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

Что такое 'begin'-'end' в' self.new' для? –

+4

Не переопределяйте 'self.new'. Это ужасная, страшная идея. Вместо этого используйте 'initialize'. –

+2

Помимо того, что вы _must not_ переопределите 'self.new', вызов' initialize' вызовет функцию класса, а не экземпляр. Похоже, вы абсолютно не понимаете, что делаете. – mudasobwa

ответ

3

Почему я не могу позвонить по телефону initialize(blatt,quellformat)?

Поскольку метод Test::new является методом класса, а метод Test#initialize - это метод экземпляра. Вам нужен экземпляр вашего класса для вызова initialize.

Определяя self.new, вы заменяете Class#new. Согласно документации:

призывает allocate создать новый объект класса «s класс, затем вызывает initialize метод этого объекта, передавая ему арг.

реализация рубин будет выглядеть следующим образом:

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

Ах. Хороший. Не знал, что у «Object» был родитель. – fylooi

+0

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