Я хочу создать подкласс Date.Почему Date.new не вызывает инициализацию?
Нормальный, здоровый, молодой rubyist, UNSCARRED по идиосинкразии реализации Дейта будет идти об этом следующим образом:
require 'date'
class MyDate < Date
def initialize(year, month, day)
@original_month = month
@original_day = day
# Christmas comes early!
super(year, 12, 25)
end
end
И продолжить использовать его в наиболее ожидаемым образом ...
require 'my_date'
mdt = MyDate.new(2012, 1, 28)
puts mdt.to_s
... только чтобы быть дважды пересек тот факт, что Date :: новый метод фактически является псевдонимом Date :: гражданским, который не когда-либо вызова Initialize. В этом случае последний фрагмент кода печатает «2012-01-28» вместо ожидаемого «2012-12-25».
Дорогой Ruby-сообщество, wtf это?
Есть некоторые очень веские основания для наложения новый, так что он игнорирует инициализации, и, как следствие, любой здравый смысл и уважение к психическому здоровью программиста клиента в?
По определению "хорошего" чей? –
Какая альтернатива? Если вы вызываете civil из инициализации, вы выделили объект, который вам не нужен. – pguardiario
Ну, кажется, семантически неправильно выделять и инициализировать объект в том же методе. Я имею в виду, если 'civil' является де-факто' new', почему бы не заставить его вызвать 'initialize' в конце? Это может быть чистая формальность в «Дата», но это позволит расширить класс без необходимости фактически просканировать детали реализации. Поэтому я задавался вопросом, почему было принято решение об алиасе 'civil' to' new'? – jst