Wie verwandle ich eine Zeichenfolge in einen Klassennamen, aber nur, wenn diese Klasse bereits vorhanden ist?
Wenn Amber bereits eine Klasse ist, kann ich von einem String zur Klasse gelangen über:
Object.const_get("Amber")
oder (in Schienen)
"Amber".constantize
Aber beides wird scheitern, NameError: uninitialized constant Amber
wenn Amber noch keine Klasse ist.
Mein erster Gedanke ist, die defined?
Methode zu verwenden, aber sie unterscheidet nicht zwischen bereits existierenden und nicht existierenden Klassen:
>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"
Wie teste ich, ob eine Zeichenfolge eine Klasse benennt, bevor ich versuche, sie zu konvertieren? (Okay, wie wäre es mit einem begin
/ rescue
Block, um NameError-Fehler abzufangen? Zu hässlich? Ich stimme zu ...)
defined?
Im Beispiel wird genau das getan, was es tun soll: Es wird überprüft, ob dieconstantize
Methode für ein String-Objekt definiert ist. Es ist egal, ob die Zeichenfolge "Object" oder "AClassNameThatCouldNotPossiblyExist" enthält.