oop/remove_const.rb

tests/_examples/oop/remove_const.rb in the metorex repository.

module Holder
  KEPT = :kept
  DOOMED = :doomed
  ALSO = :also
end

class Heir
  include Holder
end

class NameSource
  def to_str
    "ALSO"
  end
end

puts Holder.send(:remove_const, :DOOMED).inspect
puts Holder.send(:remove_const, NameSource.new).inspect
puts Holder.constants.inspect

["name", "__CONSTX__", "@Name", "Name=", "Missing"].each do |name|
  begin
    Holder.send(:remove_const, name)
    puts "#{name}: removed"
  rescue NameError
    puts "#{name}: NameError"
  end
end

begin
  Heir.send(:remove_const, :KEPT)
rescue NameError
  puts "inherited: NameError"
end

module Lazy
  autoload :Later, "a_file"
end
puts Lazy.send(:remove_const, :Later).inspect

puts Module.private_methods.include?(:remove_const).inspect
puts Module.public_instance_methods.include?(:alias_method).inspect

Output:

:doomed
:also
[:KEPT]
name: NameError
__CONSTX__: NameError
@Name: NameError
Name=: NameError
Missing: NameError
inherited: NameError
nil
true
true