41 Stimmen

Verwendung einer Zeichenkette als Variable während der Laufzeit

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?

56voto

Andres Jaan Tack Punkte 21928

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}")

15voto

Gordon Wilson Punkte 25922

Sie können verwenden eval() vorausgesetzt, Sie haben Ihre Variable zuvor deklariert:

>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"

Hier sind die docs .

13voto

Tim Sullivan Punkte 16549

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.

6voto

uma Punkte 2814

Mit der Methode instance_variable_set können Sie jetzt einfach eine Instanzvariable zur Laufzeit erstellen.

instance_variable_set('@' + 'users', User.all)

5voto

Jason Watkins Punkte 2692

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X