metaprogramming/const_defined.rb
tests/_examples/metaprogramming/const_defined.rb in the metorex repository.
# Module#const_defined? — written without parentheses where possible.
# Covers own constants, ancestor lookup, the inherit flag (with boolean
# coercion), scoped and toplevel-anchored names, unicode constant names,
# and NameError on invalid names.
module Outer
CS_CONSTλ = :unicode
module Inc
FROM_MODULE = 1
end
class Parent
FROM_PARENT = 2
end
class Child < Parent
include Inc
end
end
puts Outer.const_defined? :CS_CONSTλ
puts Outer::Child.const_defined? :FROM_PARENT
puts Outer::Child.const_defined? :FROM_MODULE
puts Outer::Child.const_defined?(:FROM_PARENT, false)
puts Outer::Child.const_defined?(:FROM_PARENT, nil)
puts Outer::Child.const_defined?(:FROM_PARENT, :truthy)
puts Outer.const_defined? "Child::FROM_PARENT"
puts Outer.const_defined? "Child::FROM_PARENT_MISSING"
puts Outer.const_defined? "::Outer"
puts Outer.const_defined? "::Missing"
puts Outer.const_defined? :CS_MISSING
begin
Outer.const_defined? "lowercase"
rescue NameError => e
puts e.class
end
begin
Outer.const_defined? "Name?"
rescue NameError => e
puts e.class
end
Output:
true
true
true
false
false
true
true
false
true
false
false
NameError
NameError