Ich habe eine Zeichenfolge, die zur Laufzeit erstellt wurde. Ich möchte diese Zeichenfolge als Variable verwenden, um einige Daten darin zu speichern. Wie kann ich die Zeichenfolge in einen Variablennamen umwandeln?
Antworten
Zu viele Anzeigen?Wenn Sie ein @-Zeichen vor dem Variablennamen vergeben können, funktioniert Folgendes:
variable_name = ... # determine user-given variable name
instance_variable_set("@#{variable_name}", :something)
Dadurch wird eine Variable mit dem Namen @whatever
mit einem Wert von :something
. Die :something
kann natürlich alles sein, was Sie wollen. Dies scheint im globalen Bereich zu funktionieren, indem man eine spontane Object
Instanz, die alles bindet (ich kann keine Referenz dafür finden).
En instance_variable_get
Methode können Sie einen Wert nach Namen auf dieselbe Weise abrufen.
instance_variable_get("@#{variable_name}")
Sie können verwenden eval()
vorausgesetzt, Sie haben Ihre Variable zuvor deklariert:
>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"
Hier sind die docs .
Anstatt dies direkt zu tun, sollten Sie stattdessen einen Hash verwenden. Die Zeichenkette wäre der Schlüssel und der Wert, den Sie speichern möchten, wäre der Wert. Etwas wie dies:
string_values = { }
some_string = params[:some_string] # parameter was, say "Hello"
string_values[some_string] = 42
string_values # { 'Hello' => 42 }
some_number = string_values[some_string]
some_number # 42
Dies hat mehrere Vorteile. Erstens bedeutet es, dass Sie nichts Magisches tun, was später schwer herauszufinden sein könnte. Zweitens verwenden Sie ein sehr gebräuchliches Ruby-Idiom, das für ähnliche Funktionen in Rails verwendet wird.
Ich will nicht negativ sein, aber seien Sie vorsichtig. Ruby bietet viele Funktionen für hochdynamische Programmierung, wie z.B. define_method
und speichern Blöcke als Proc
Objekte, die später aufgerufen werden sollen, usw. Im Allgemeinen ist dieser Code sauberer und viel sicherer. In 99% der Fälle ist die Verwendung von eval()
ist ein Fehler.
Und verwenden Sie auf keinen Fall eval()
auf eine Zeichenfolge, die vom Benutzer eingegebene Daten enthält.
- See previous answers
- Weitere Antworten anzeigen