1
class Object
  alias :old_initialize :initialize
  def initialize
    old_initialize
    print "AN OBJECT WAS CREATED"
  end
end

class Test

end

test = Test.new

这可以按预期工作,打印"AN OBJECT WAS CREATED".

但是如果你使用像Array, Hash, or之类的核心类String,什么都不会发生:

array = Array.new
hash = Hash.new
string = String.new

这是为什么?我原以为它们都是 的子类Object,因此对其进行任何更改都会起作用。但显然它只适用于我的自定义类。

为了让它更混乱,我意识到正如警告所说,我的修改应该创建一个无限循环,因为"AN OBJECT WAS CREATED"基本上是创建一个新String实例 - 但没有循环发生。现在我更加困惑了。

红宝石 1.8.7

4

2 回答 2

5

如果子类定义了自己的initialize并且不调用父类的initializeinitialize则不会执行。

例如,

class Base
  def initialize; print 'A created' end
end

class Sub1 < Base
  def initialize; super end
end

class Sub2 < Base
  def initialize; end
end

class Sub3 < Base
end

>> Sub1.new
A created=> #<Sub1:0x00000001429630>
>> Sub2.new
=> #<Sub2:0x000000014254e0>
>> Sub3.new
A created=> #<Sub3:0x00000001422128>
于 2013-08-14T09:47:02.013 回答
0

如果 ruby​​ 真的initialize像任何其他方法一样考虑,那么当您创建自定义对象时,将遵循方法查找路径并采用第一个定义的initialize方法。

class Base
attr_reader :foo

  def initialize
    @foo = 42
  end
end

class A < Base; end

class B < A
  def initialize
    puts "I override initialize"
  end
end

A.new.foo #=> 42
B.new.foo #=> nil

您可以在此处找到有关查找路径解析的更多信息

于 2013-08-14T10:41:01.437 回答