metaprogramming/const_get.rb
tests/_examples/metaprogramming/const_get.rb in the metorex repository.
# Module#const_get — written without parentheses where possible. Covers
# ancestor lookup, the inherit flag, scoped and toplevel-anchored names,
# const_missing dispatch, NameError#name, and paren-less lambda
# parameters.
module Lookup
module Inc
FROM_MODULE = :from_module
end
class Parent
FROM_PARENT = :from_parent
end
class Child < Parent
include Inc
end
class Handled
def self.const_missing name
[:missing, name]
end
end
end
TOP_CONST = :top
puts Lookup::Child.const_get(:FROM_PARENT).inspect
puts Lookup::Child.const_get(:FROM_MODULE).inspect
puts Lookup::Child.const_get(:TOP_CONST).inspect
puts Lookup.const_get("Child::FROM_PARENT").inspect
puts Lookup.const_get("::TOP_CONST").inspect
puts Lookup::Handled.const_get(:ANYTHING).inspect
inspect_error = -> e { puts e.name.inspect }
begin
Lookup::Child.const_get :FROM_PARENT, false
rescue NameError => e
inspect_error.call e
end
begin
Lookup.const_get "no_caps"
rescue NameError
puts "NameError"
end
Output:
:from_parent
:from_module
:top
:from_parent
:top
[:missing, :ANYTHING]
:FROM_PARENT
NameError