metaprogramming/const_set_parens.rb

tests/_examples/metaprogramming/const_set_parens.rb in the metorex repository.

# Module#const_set — written with parentheses. Covers return value,
# anonymous-module naming (including the cascade into nested anonymous
# modules), name validation, and the frozen check.
mod = Module.new
puts(mod.name.inspect)

a, b, c = Module.new, Module.new, Module.new
a::B = b
a::B::C = c

Object.const_set(:NamedRoot, a)
puts(a.name)
puts(b.name)
puts(c.name)

inner = Module.new
scoped = Module.new
scoped.const_set(:Inner, inner)
puts(inner.name.end_with?("::Inner"))

puts(NamedRoot.const_set(:VALUE, 41).inspect)

begin
  NamedRoot.const_set("lowercase", 1)
rescue NameError
  puts("NameError")
end

frozen = Module.new.freeze
begin
  frozen.const_set(:Foo, 1)
rescue FrozenError
  puts("FrozenError")
end

Object.send(:remove_const, :NamedRoot)

Output:

nil
NamedRoot
NamedRoot::B
NamedRoot::B::C
true
41
NameError
FrozenError