0

メタプログラミングが class のサブクラスを作成する次のスニペットがありますVehicle

class Vehicle; end

klazz = Class.new(Vehicle)
Object.const_set('Car', klazz)

ここには派手なものはありません。予想通り、配列Vehicle.subclassesが返されます。[Car]

次に、Car クラスの定義を次のように削除しました。

Object.send(:remove_const, :Car)

そして驚いたことに、次のようsubclassesに動的にリロードされません。

Vehicle.subclassess.count == 1

remove_constサブクラスをリロードする方法や、使用方法が間違っているかどうかを知りたいです。ティア

4

1 に答える 1

1

subclassesは純粋な Ruby の一部ではありませんが、そうremove_constです。おそらくここで起こっていることは、フックsubclassesでインクリメントされるカウンターを介してメソッドが実装されていることです。inheritedただし、定数の削除はコードベース内で通常行われることではないため、おそらく関連するデクリメントはありません ( のフックがあるとは思わないためclass_removed、関連するデクリメントを簡単に持つことはできませんでした)。

技術的には、何をデクリメントするかを理解するために書き直すこともできますがremove_const、それは価値がないと思いますし、賢明な動きでもないと思います (モンキーパッチのコアメソッドは常に疑わしい IMO です)。

于 2013-02-07T07:47:37.560 に答える