Я пишу класс, где переменная экземпляра имеет значение, которое должно быть установлено во время инициализации, или класс не будет работать. Класс предназначен для сильно подкласса, и я не хочу, чтобы все подклассы приходилось вызывать super
в своих перегрузках initialize
, поэтому я хотел бы установить переменную экземпляра до вызывается функция инициализации.Как сделать материал экземпляру класса до вызова #initialize?
Is возможно, путем перегрузки Class#new
или что-то подобное, чтобы сделать некоторые пользовательские инициализации экземпляра перед тем функция initialize
называется?
Как:
class Foo < MySuperClass
def initialize
# @foo is already set to 123 because of the magic in MySuperClass
assert @foo == 123
end
end
Вы можете привести пример, объясняющий необходимость такого поведения? – xlembouras
@xlembouras Я думал, что сделал это в вопросе. Суперкласс верхнего уровня определяет набор методов, которые все предполагают, что определенная переменная экземпляра была инициирована в методе '# initialize'. Если пользователь переопределяет '# initialize', тогда все эти методы ломаются. Я сделал это сам, и мне пришлось отлаживать какое-то время, прежде чем я понял, что переменная экземпляра была 'nil'. «Точка этого поведения» состоит в том, чтобы иметь возможность выполнить некоторую инициализацию * до того, как * будет выполняться подкласс, с добавленным бонусом, что подкласс не может случайно предотвратить перезапуск суперкласса, вызвав запутывающие ошибки. – Hubro
@xlembouras Вот конкретный случай, о котором я говорю: https://github.com/Hubro/Datastruct. В нескольких методах предполагается, что '@ data' является определенным хешем и не будет выполнен, если он не инициализирован. – Hubro