0

我有一个以下片段,元编程创建了一个类的子类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

4

1 回答 1

1

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

从技术上讲,您可以重写remove_const以使其弄清楚要减少的内容,但我认为这不值得,也不是明智之举(猴子修补核心方法总是有问题的 IMO)。

于 2013-02-07T07:47:37.560 回答