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