2010-03-27 15 views
18

Ho appena iniziato a imparare Ruby e ho scritto un programma che genera alcuni numeri e li assegna alle variabili @ one, @two, @three ecc. L'utente può quindi specificare una variabile da modificare inserendo il suo nome (ad esempio uno). Ho quindi bisogno di fare qualcosa come '@ [valueofinout] = asd'. Come potrei fare questo, e c'è un modo migliore in quanto il modo in cui sto pensando sembra essere scoraggiato? Ho trovatoUso del valore di una variabile come un altro nome di variabili in Ruby

x = "myvar" 
myvar = "hi" 
eval(x) -> "hi" 

ma non capisco completamente perché è necessaria la seconda riga. Nel mio caso dovrei usare qualcosa di simile

@one = "21" 
input = "one" 
input = "@" + input 
changeto = "22" 
eval(input) -> changeto 

risposta

28

Usa instance_variable_set (rubydoc)

instance_variable_set("@" + varname, value) 

Nella maggior parte dei casi, però, si dovrebbe separare le normali variabili rubino dalle variabili l'utente interagisce con. Che ne dici di creare un hash di variabili utente, ad es.

@uservars = { 'one' => 1, 'two' => 2 } 
two = @uservars['two'] # Look up 'two' variable 

varname = "myvar" 
@uservars[varname] = 5 # Set a variable by name 
value = @uservars[varname] # Get a variable by name 
+1

wow, questa è in realtà un'area in cui PHP sfiora il rubino in termini di pulizia della sintassi. http://stackoverflow.com/a/4169891/2951835 – ahnbizcad

+0

Ruby rende difficile farlo perché è brutto, raramente è necessario impostare una variabile specificata dall'utente di un'istanza, a meno che non si stia eseguendo la metaprogrammazione. Il pasticcio dinamico con le variabili globali è un buco di sicurezza; se vuoi un insieme di variabili definite dall'utente allora probabilmente vuoi un hash. – rjh

2

variabili di istanza possono essere recuperate tramite questo metodo:

input = instance_variable_get("@one") 

Dopo questo, nel tuo caso si dovrà input uguale a "21".

+0

Ciao, non so se questo funzionerebbe per quello che mi serve. Avrei bisogno di avere qualcosa che assegni un certo numero a una variabile (diciamo la variabile A) ma il nome della variabile A non è noto. Il nome della variabile A è memorizzato all'interno della variabile B anche se quindi dovrei usare il valore della variabile B per assegnare qualcosa alla variabile A. AFAICT questo non può essere fatto con instance_variable_get. – hrickards

+0

@hrickards: conosci i valori possibili di A? se lo fai, c'è un altro modo. Ma intance_variable_get dovrebbe fare quello che vuoi! –

+0

@Niklaos Un numero intero compreso tra 1 e 49 – hrickards

Problemi correlati