2010-03-02 14 views

Odpowiedz

61

Można użyć metody Module#const_get. Przykład:

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

Jeśli masz ActiveSupport ładowane (np Rails) można użyć

"User".constantize 
22

Zalecanym sposobem jest użycie ActiveSupport za constantize:

'User'.constantize 

Można również użyć Kernela const_get, ale w języku Ruby < 2.0 nie obsługuje stałych ze spacjami, więc coś takiego:

Kernel.const_get('Foobar::User') 

zakończy się niepowodzeniem w Ruby < 2.0. Więc jeśli chcesz rodzajowe rozwiązanie, chcesz być mądry, aby stosowanie metody 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 działa również dla stałych o stałych z nazwami od ruby ​​2.0 – untidyhair

+0

Ponieważ Ruby 2.0 osiągnął EOL, nie ma już potrzeby ciągnięcia ActiveSupport jako zależności od stałej w łańcuchu. :-) – Drenmi

+0

Zobacz także "User'.safe_constantize" –

75
Object.const_get("User") 

Nie trzeba wymagać ActiveSupport.

+40

+1 chory na active_support zanieczyszczający ogólne pytania rubinowe. –

-3

Zastosowanie rubin magiczna metoda: eval():

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

Jest to prawdopodobnie kompletna przesada, ponieważ 'eval' nie ma być używana w ten sposób, a unikanie bardziej konkretnych alternatyw powinno być całkowicie unikane. – yagooar

Powiązane problemy