Module: Skylight::Util::Inflector Private
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Instance Method Summary collapse
-
#constantize(camel_cased_word) ⇒ Object
private
Tries to find a constant with the name specified in the argument string.
-
#safe_constantize(camel_cased_word) ⇒ Object
private
Tries to find a constant with the name specified in the argument string.
Instance Method Details
#constantize(camel_cased_word) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tries to find a constant with the name specified in the argument string.
'Module'.constantize # => Module
'Test::Unit'.constantize # => Test::Unit
The name is assumed to be the one of a top-level constant, no matter whether it starts with “::” or not. No lexical context is taken into account:
C = 'outside'
module M
C = 'inside'
C # => 'inside'
'C'.constantize # => 'outside', same as ::C
end
NameError is raised when the name is not in CamelCase or the constant is unknown.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/skylight/util/inflector.rb', line 26 def constantize(camel_cased_word) names = camel_cased_word.split('::') # Trigger a builtin NameError exception including the ill-formed constant in the message. Object.const_get(camel_cased_word) if names.empty? # Remove the first blank element in case of '::ClassName' notation. names.shift if names.size > 1 && names.first.empty? names.inject(Object) do |constant, name| if constant == Object constant.const_get(name) else candidate = constant.const_get(name) next candidate if constant.const_defined?(name, false) next candidate unless Object.const_defined?(name) # Go down the ancestors to check it it's owned # directly before we reach Object or the end of ancestors. constant = constant.ancestors.inject do |const, ancestor| break const if ancestor == Object break ancestor if ancestor.const_defined?(name, false) const end # owner is in Object, so raise constant.const_get(name, false) end end end |
#safe_constantize(camel_cased_word) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tries to find a constant with the name specified in the argument string.
'Module'.safe_constantize # => Module
'Test::Unit'.safe_constantize # => Test::Unit
The name is assumed to be the one of a top-level constant, no matter whether it starts with “::” or not. No lexical context is taken into account:
C = 'outside'
module M
C = 'inside'
C # => 'inside'
'C'.safe_constantize # => 'outside', same as ::C
end
nil
is returned when the name is not in CamelCase or the constant (or part of it) is unknown.
'blargle'.safe_constantize # => nil
'UnknownModule'.safe_constantize # => nil
'UnknownModule::Foo::Bar'.safe_constantize # => nil
79 80 81 82 83 84 85 86 |
# File 'lib/skylight/util/inflector.rb', line 79 def safe_constantize(camel_cased_word) constantize(camel_cased_word) rescue NameError => e raise unless e. =~ /(uninitialized constant|wrong constant name) #{const_regexp(camel_cased_word)}$/ || e.name.to_s == camel_cased_word.to_s rescue ArgumentError => e raise unless e. =~ /not missing constant #{const_regexp(camel_cased_word)}\!$/ end |