2013-02-07 15 views
0

除去类的定义后,我有下面的代码片段是元编程创建Vehicle类的子类:Rails的动态重新Class.subclasses与remove_const

class Vehicle; end 

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

没有看中这里。正如我所料,Vehicle.subclasses会返回我[Car]阵列。

接下来,我删除与类车的定义:

Object.send(:remove_const, :Car) 

和我惊讶的是,subclasses不是动态重新加载,如:

Vehicle.subclassess.count == 1 

我很想知道我可以重新加载子类,或者如果我使用remove_const的方式是错误的。 TIA

+1

此'Vehicle.subclasses'方法来自哪里?我没有一个。 –

+0

'子类'可能来自'ActiveSupport' –

+0

@SergioTulentsev它来自铁路,请原谅我,它不是只有红宝石。那么有没有办法用ruby检索Vehicle的子类? –

回答

1

subclasses不是纯Ruby的一部分,而remove_const是。这里可能会发生什么,subclasses方法是通过一个计数器实现的,该计数器在inherited钩子上增加。但是,由于删除常量通常不是在代码库内部完成的,因此可能没有相关的减量(我不相信class_removed有钩子,所以它们不能轻易地进行相关的减量)。从技术上讲,你可以重写remove_const来弄清楚减少什么,但我认为这不值得,也不会是一个聪明的举动(猴子修补核心方法总是有问题的IMO)。