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、またはのようなコア クラスを使用するとString、何も起こりません。

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

何故ですか?それらはすべてからサブクラス化されていると思っていたObjectので、変更しても機能します。しかし、どうやらそれは私のカスタムクラスでのみ機能します。

さらに混乱させるために、警告が言ったように、"AN OBJECT WAS CREATED"基本的に新しいStringインスタンスを作成するため、私の変更は無限ループを作成する必要があることに気付きましたが、ループは発生しません。今、私はさらに混乱しています。

ルビー 1.8.7

4

2 に答える 2

5

サブクラスが独自initializeに定義し、親の を​​呼び出さないinitialize場合、そのサブクラスinitializeは実行されません。

例えば、

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 に答える