2012-06-05 3 views
1

Я заметил, что если я создаю подкласс, который наследует от Datetime, то это .now вернет экземпляр подкласса, а не Datetime экземпляр.ruby ​​- вернуть экземпляр текущего класса

class MyDateTime < DateTime 
end 

MyDateTime.now 
>#<MyDateTime: 2012-06-05T16:42:57+08:00 ((2456084j,31377s,900801494n),+28800s,2299161j)> 

Кажется магическим. Я не могу воспроизвести это поведение в моем собственном классе:

class A 
    def self.a 
    return A.new 
    end 
end 

class B < A 
end 

B.a 
#<A:0x00000001e22358> 

Я попытался прочитать исходный код DateTime но он написан на C. Можно ли написать метод класса, который возвращает экземпляр класса это принадлежит?

ответ

4

Попробуйте с собой:

class A 
    def self.a 
    return self.new 
    end 
end 

class B < A 
end 

B.a 
+0

так очевидно ... спасибо –

+2

Примечания: 'self' является приемником по умолчанию, а возвращаемое значение последнего выражения является возвращаемым значением методы, так как 'self', так и' return' здесь избыточны. Идиоматическая версия будет больше похожа на 'def self.a; новый конец –

+0

Несомненно, я просто хотел как можно меньше изменить в данном примере, чтобы подчеркнуть разницу. – Matzi