2009-05-19 14 views

risposta

6

È possibile utilizzare eval() per questo a condizione che hai dichiarato la variabile prima:

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

Ecco i docs.

5

Non intendo essere negativo, ma procedere con cautela. Ruby offre molte funzionalità per la programmazione altamente dinamica come define_method, la memorizzazione di blocchi come Proc oggetti da chiamare in seguito, ecc. In genere si tratta di un codice più pulito e molto più sicuro. Il 99% delle volte utilizzando eval() è un errore.

E assolutamente non utilizzare mai eval() su una stringa che contiene l'input inviato dall'utente.

53

Se si può perdonare un simbolo @ davanti al nome della variabile, il proceda in questo modo:

variable_name = ... # determine user-given variable name 
instance_variable_set("@#{variable_name}", :something) 

questo modo si crea una variabile denominata @whatever, con il suo valore impostato :something. Il :something, chiaramente, potrebbe essere tutto ciò che vuoi. Questo sembra funzionare in ambito globale, dichiarando un'istanza spontanea Object che lega tutto (non riesco a trovare un riferimento per questo).

Il metodo instance_variable_get consente di recuperare un valore per nome nello stesso modo.

instance_variable_get("@#{variable_name}") 
+0

Perché '@ # {nome_variabile} =: qualcosa' funziona? –

+0

I get 'non è permesso come un nome di variabile di istanza' per' instance_variable_set'. Rails 3.0.7. –

+0

Questo è geniale! –

0

Come dice Jason Watkins, un sacco di gente potrebbe essere veloce da usare eval() prima cosa e questo sarebbe un grave errore. Il più delle volte puoi usare la tecnica descritta da Tack se hai avuto cura di usare una variabile di istanza di classe invece di una locale.

Le variabili locali non sono generalmente recuperabili. Qualsiasi cosa con il prefisso @ o @@ è facilmente recuperabile.

10

Piuttosto che farlo direttamente, perché non considerare l'utilizzo di un hash invece. La stringa sarebbe la chiave e il valore che si desidera memorizzare sarebbe il valore. Qualcosa del genere:

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 

Questo ha un paio di vantaggi. Primo, significa che non stai facendo nulla di magico che potrebbe essere difficile da capire in seguito. Secondo, stai usando un idioma Ruby molto comune che viene utilizzato per funzionalità simili su Rails.

+0

il mio pensiero esattamente :) –

+0

Huh? Cosa succede se si desidera memorizzare "Hello" come variabile da utilizzare in seguito. Da dove viene il 42? Questo sembra troppo complesso ...anche se devo ammettere che sono un neofita di Ruby. – Southerneer

+0

Non è quello che sta chiedendo l'interrogante. Stanno ricevendo un valore stringa da qualche parte in * runtime * e desiderano associare quella stringa con un valore. Certo, potresti hackerare il sistema per creare una variabile con quel nome di stringa (con il relativo avvertimento di errore controllando la stringa per assicurarti che sia un identificatore valido), ma quello che sto suggerendo è usare Ruby, semplice, ampiamente compreso e sicuro ' Hash' per associare la stringa e il valore insieme. –

2

Ora utilizzando semplicemente il metodo instance_variable_set, è possibile creare una variabile di istanza in fase di runtime.

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