web-dev-qa-db-de.com

Verwenden einer Zeichenfolge als Variable zur Laufzeit

Ich habe eine Zeichenfolge, die zur Laufzeit erstellt wurde. Ich möchte diese Zeichenfolge als Variable verwenden, um Daten darin zu speichern. Wie kann ich den String in einen Variablennamen konvertieren?

36
Satyam Gautam

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 erstellt, deren Wert auf :something gesetzt ist. Der :something kann natürlich alles sein, was Sie wollen. Dies scheint im globalen Bereich zu funktionieren, indem eine spontane Object-Instanz deklariert wird, die alles bindet (ich kann dafür keine Referenz finden).

Mit der instance_variable_get-Methode können Sie auf dieselbe Weise einen Wert anhand des Namens abrufen.

instance_variable_get("@#{variable_name}")
54

Anstatt dies direkt zu tun, sollten Sie stattdessen einen Hash verwenden. Die Zeichenfolge wäre der Schlüssel und der Wert, den Sie speichern möchten, ist der Wert. Etwas wie das:

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 einige Vorteile. Erstens bedeutet das, dass Sie keine Zauberei ausführen, die später schwer zu verstehen ist. Zweitens verwenden Sie ein allgemeines Ruby-Idiom, das in Rails für ähnliche Funktionen verwendet wird.

12
Tim Sullivan

Sie können eval() dafür verwenden, vorausgesetzt, Sie haben Ihre Variable zuerst deklariert:

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

Hier sind die docs .

8
Gordon Wilson

Ich will nicht negativ sein, sondern vorsichtig vorgehen. Ruby bietet eine Vielzahl von Funktionen für hochdynamische Programmierung wie define_method, das Speichern von Blöcken als Proc-Objekte, die später aufgerufen werden sollen, usw. Im Allgemeinen handelt es sich dabei um saubereren Code, der weitaus sicherer ist. Die Verwendung von eval() in 99% der Fälle ist ein Fehler.

Verwenden Sie auf keinen Fall eval() für eine Zeichenfolge, die vom Benutzer eingegebene Eingaben enthält. 

5
Jason Watkins

Jetzt können Sie einfach mit der Methode instance_variable_set eine Instanzvariable zur Laufzeit erstellen.

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

Wie Jason Watkins sagt, könnten viele Leute eval () auf Anhieb schnell verwenden, und dies wäre ein schwerwiegender Fehler. In den meisten Fällen können Sie die von Tack beschriebene Technik verwenden, wenn Sie darauf geachtet haben, eine Klasseninstanzvariable anstelle einer lokalen zu verwenden.

Lokale Variablen sind im Allgemeinen nicht abrufbar. Alles mit dem Präfix @ oder @@ wird leicht abgerufen.

0
tadman