Ich möchte auch eine Antwort auf diese Frage; Versuchen Sie jedoch, eine neue Konstante basierend auf einer Zeichenfolge zu erstellen, ODER suchen Sie eine bereits initialisierte Konstante? Suchen Sie auch Vanille Rubin oder auch Rails?
Die empfohlene Methode ist die Verwendung der ActiveSupport-Konstante:
'User'.constantize
Sie können auch Kernel verwenden const_get, aber in Ruby <2.0 werden keine Konstanten mit Namespace unterstützt, also ungefähr so:
Kernel.const_get('Foobar::User')
wird in Ruby <2.0 fehlschlagen. Wenn Sie also eine generische Lösung wünschen, sollten Sie den ActiveSupport-Ansatz verwenden:
defmy_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
Seit Ruby 2.0 EOL erreicht hat, muss ActiveSupport nicht mehr als Abhängigkeit abgerufen werden, um auf eine Konstante mit einer Zeichenfolge zu verweisen. :-)
Dies ist wahrscheinlich ein völliger Overkill, da er evalnicht so verwendet werden soll, und spezifischere Alternativen sollten vollständig vermieden werden.
Antworten:
Object.const_get("User")
ActiveSupport ist nicht erforderlich.
quelle
class User; def self.lookup; const_get('SomeClassName);end; end
User.lookup
Gibt die Klasse selbst zurück.Sie können die
Module#const_get
Methode verwenden. Beispiel:irb(main):001:0> ARGV => [] irb(main):002:0> Kernel.const_get "ARGV" => []
quelle
Wenn Sie ActiveSupport geladen haben (z. B. in Rails), können Sie verwenden
"User".constantize
quelle
Die empfohlene Methode ist die Verwendung der ActiveSupport-Konstante:
'User'.constantize
Sie können auch Kernel verwenden
const_get
, aber in Ruby <2.0 werden keine Konstanten mit Namespace unterstützt, also ungefähr so:Kernel.const_get('Foobar::User')
wird in Ruby <2.0 fehlschlagen. Wenn Sie also eine generische Lösung wünschen, sollten Sie den ActiveSupport-Ansatz verwenden:
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
quelle
'User'.safe_constantize
Verwenden Rubin magische Methode:
eval()
:eval("User") #=> User
quelle
eval
nicht so verwendet werden soll, und spezifischere Alternativen sollten vollständig vermieden werden.