Автоматическое замораживание объектов после инициализации

Я устал от добавления 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; определите там новую версию инициализации, которая вызывает инициализацию объекта, а затем вызывает остановку. Оттуда вы можете получить ваши классы наследовать от этого подкласса.

Другие вопросы по тегам