metaprogramming/const_set.rb
tests/_examples/metaprogramming/const_set.rb in the metorex repository.
# Module#const_set — written without parentheses where possible. Covers
# return value, anonymous-module naming (including the cascade into
# nested anonymous modules), the redefinition warning, 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