Автоматическое замораживание объектов после инициализации
Я устал от добавления freeze
в конце метода initialize
из моих классов все время, как это:
class Foo
def initialize
# some stuff
freeze
end
end
Я хотел бы сделать это по умолчанию для любого объекта. Я думал о переопределении BasicObject#initialize
внутри Object
класс, который предоставляет метод freeze
но я не вижу как.
1 ответ
Так как вы задали вопрос...
Вы можете сделать это с помощью исправления обезьяны и alias_method
формирование цепочки
$ irb
irb(main):001:0> class Object
irb(main):002:1> alias_method :old_init, :initialize
irb(main):003:1>
irb(main):004:1* def initialize
irb(main):005:2> old_init
irb(main):006:2> self.freeze
irb(main):007:2> end
irb(main):008:1> end
(irb):4: warning: redefining Object#initialize may cause infinite loop
Это сказал; это абсолютно ужасная идея, и я подозреваю, что это нарушит некоторые основные функции Ruby. Обратите внимание, что даже irb говорит: "Ого! Не делай этого" => warning: redefining Object#initialize may cause infinite loop
Было бы гораздо лучше определить свой собственный класс, который выходит из Object; определите там новую версию инициализации, которая вызывает инициализацию объекта, а затем вызывает остановку. Оттуда вы можете получить ваши классы наследовать от этого подкласса.