Ho una stringa, che è stata creata in fase di esecuzione. Voglio usare questa stringa come variabile per memorizzare alcuni dati in essa. Come posso convertire la stringa in un nome di variabile?Utilizzo di una stringa come variabile in fase di esecuzione
risposta
È possibile utilizzare eval()
per questo a condizione che hai dichiarato la variabile prima:
>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"
Ecco i docs.
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.
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}")
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.
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.
il mio pensiero esattamente :) –
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
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. –
Ora utilizzando semplicemente il metodo instance_variable_set, è possibile creare una variabile di istanza in fase di runtime.
instance_variable_set('@' + 'users', User.all)
- 1. scegliere una monade in fase di esecuzione
- 2. Impostazione tipo generico in fase di esecuzione
- 3. Come posso tracciare una variabile in fase di esecuzione in C#?
- 4. Utilizzo di stringhe stringa identiche anziché di una variabile finale?
- 5. Fortran - tipo di impostazione/precisione di una variabile in fase di esecuzione
- 6. Come convertire una stringa in un tipo Nullable Che è determinato in fase di esecuzione?
- 7. Voglio ottenere il tipo di una variabile in fase di esecuzione
- 8. Rimozione di una funzione in fase di esecuzione in PHP
- 9. Esecuzione di una fase Maven specifica
- 10. Modifica implementazione/classe in fase di esecuzione
- 11. Modifica del valore di una macro in fase di esecuzione
- 12. Come faccio a sbarazzarmi di LD_LIBRARY_PATH in fase di esecuzione?
- 13. Posso inserire una colonna in listview in fase di esecuzione?
- 14. Python sqlite3 stringa variabile in esecuzione
- 15. jQuery: utilizzo di una variabile come selettore
- 16. Modifica oggetto iniettato in fase di esecuzione
- 17. Utilizzo di una variabile globale in javascript
- 18. Estendere classe in fase di esecuzione
- 19. Sostituisci bean in fase di esecuzione
- 20. Nuovo per Android - Disegnare una vista in fase di esecuzione
- 21. Castle Windsor Resolve in fase di esecuzione
- 22. esclusione in fase di esecuzione __setattr__
- 23. metodo call in fase di esecuzione
- 24. Ridimensionamento dei controlli in fase di esecuzione
- 25. Modifica proprietà log4j in fase di esecuzione
- 26. Cambiare l'orientamento in fase di esecuzione
- 27. Aggiungere animazione in fase di esecuzione
- 28. Ottieni binding IIS in fase di esecuzione
- 29. È possibile guardare le variabili in fase di esecuzione?
- 30. Posso espandere una stringa che contiene C# espressioni letterali in fase di esecuzione
Perché '@ # {nome_variabile} =: qualcosa' funziona? –
I get 'non è permesso come un nome di variabile di istanza' per' instance_variable_set'. Rails 3.0.7. –
Questo è geniale! –