Недавно в статье о Переменных и константах в Ruby я упомянул о том, что из строки можно получить константу используя Kernel.const_get, на что получил в комментариях целых два замечания. Первое касалось того, что следует использовать Object.const_get, вместо Kernel.const_get, а второе касалось того, что нужно учитывать неймспейсы, а потому получение констант из строки несколько сложнее реализовать. Та статья была о другом, потому, я решил добавить отдельную статью в Tips & Tricks о том, как правильно получать из строки константу.
Код выполняющий это действие я решил поместить в метод #constantize, метод называется так же, как аналогичный метод в Rails, и создать для него псевдоним #to_const. Собственно вот его код:
class String
def constantize
constants = self.split("::")
main = Object.const_get(constants.shift)
constants.inject(main) { |full, nested| full = full.const_get(nested) }
end
alias :to_const :constantize
end
Пример работы:
module SuperExtensions
module MySuperExtension
class Extension
def self.hello
puts "Hello!"
end
end
end
end
klass = "SuperExtensions::MySuperExtension::Extension".to_const
klass #=> SuperExtensions::MySuperExtension::Extension
klass.hello # Hello!
Вот и все! Удачи!