Module: Skylight::Core::Util::Inflector Private
Overview
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.
String Inflector methods
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.
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 56 57 58 |
# File 'lib/skylight/core/util/inflector.rb', line 29 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
82 83 84 85 86 87 88 89 |
# File 'lib/skylight/core/util/inflector.rb', line 82 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 |