如何在Ruby中取消定义命名空间类?

zub*_*uba 1 ruby

我可以取消定义Bar(如何在Ruby中取消定义类?),但是如何取消定义Foo :: Bar?

irb(main):266:0> Object.send :remove_const, :ActiveRecord::Base
TypeError: :ActiveRecord is not a class/module

irb(main):267:0> Object.send :remove_const, :"ActiveRecord::Base"
NameError: `ActiveRecord::Base' is not allowed as a constant name

irb(main):269:0> module ActiveRecord; Object.send :remove_const, :Base; end
NameError: constant Object::Base not defined
Run Code Online (Sandbox Code Playgroud)

Hol*_*ust 8

常量在它们各自的父模块中定义,顶级常量在Object类上定义.

因此,ActiveRecord::BaseBaseActiveRecord模块上定义的常量().现在,为了删除此常量,您必须remove_constActiveRecord模块上调用该方法:

ActiveRecord.send(:remove_const, :Base)
Run Code Online (Sandbox Code Playgroud)

或者,您也可以直接遍历路径Object,即

Object.const_get(:ActiveRecord).send(:remove_const, :Base)
Run Code Online (Sandbox Code Playgroud)