2010-03-02 5 views
53

Как преобразовать строку в User?Как преобразовать строку в константу в Ruby?

+0

Вы пытаетесь вызвать переменную функцию? – harbichidian

+1

Мне также хотелось бы ответить на этот вопрос; однако вы пытаетесь создать новую константу на основе строки, ИЛИ найти уже инициализированную константу? Также вы ищете ванильный рубин или Rails? – onebree

ответ

61

Вы можете использовать метод Module#const_get. Пример:

irb(main):001:0> ARGV 
=> [] 
irb(main):002:0> Kernel.const_get "ARGV" 
=> [] 
25

Если у вас есть ActiveSupport загружены (например, в Rails), вы можете использовать

"User".constantize 
22

Рекомендуемый способ заключается в использовании constantize ActiveSupport в:

'User'.constantize 

Вы также можете использовать загрузки ядра const_get, но в Ruby < 2.0 он не поддерживает константы с именами, что-то вроде этого:

Kernel.const_get('Foobar::User') 

не работает в Ruby < 2.0. Так что если вы хотите, общее решение, вы бы разумно использовать ActiveSupport подход:

def my_constantize(class_name) 
    unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name 
    raise NameError, "#{class_name.inspect} is not a valid constant name!" 
    end 

    Object.module_eval("::#{$1}", __FILE__, __LINE__) 
end 
+8

const_get работает также для констант с именами, начиная с ruby ​​2.0 – untidyhair

+0

Поскольку Ruby 2.0 достиг EOL, больше нет необходимости втягивать ActiveSupport в зависимость от ссылки на константу со строкой. :-) – Drenmi

+0

См. Также '' User'.afe_constantize' –

75
Object.const_get("User") 

Нет необходимости требовать ActiveSupport.

+40

+1 больной active_support, загрязняющий общие рубиновые вопросы. –

-3

Используйте рубин магический метод: eval():

eval("User") #=> User 
+4

Это, вероятно, полный перебор, поскольку 'eval' не предназначен для использования таким образом, и с более конкретными альтернативами следует полностью избегать. – yagooar

Смежные вопросы