初始化后自动冻结对象

时间:2014-10-18 16:16:12

标签: ruby oop immutability freeze

我已经厌倦了在我的课程的freeze方法的末尾添加initialize,如下所示:

class Foo
  def initialize
    # some stuff
    freeze
  end
end

我想默认为任何对象执行此操作。我想在BasicObject#initialize类中覆盖Object,它提供方法freeze,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

既然你问了这个问题......

您可以通过猴子修补和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扩展的自己的类会更好一点;定义一个新版本的初始化,调用对象的初始化,然后调用冻结。从那里你可以让你的类继承自这个子类。