使用remove_const删除类定义后,Rails动态重新加载Class.subclasses

时间:2013-02-07 07:34:15

标签: ruby-on-rails ruby

我有一个以下代码片段,元编程创建了类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的方式是错误的。 TIA

1 个答案:

答案 0 :(得分:1)

subclasses不是纯Ruby的一部分,而remove_const是。这里可能发生的是subclasses方法是通过一个在inherited钩子上递增的计数器实现的。但是,由于删除常量通常不是在代码库内部完成的,因此可能没有相关的减量(我不相信class_removed有一个钩子,所以它们不能轻易地有相关的减量)

从技术上讲,你可以重写remove_const来弄清楚要减少什么,但我认为这不值得,也不是一个聪明的举动(猴子修补核心方法总是值得怀疑的IMO )。