2009-02-02 20 views
7

C'è un modo per accedere a tutto nella tabella dei simboli in Ruby? Voglio essere in grado di serializzare o altrimenti salvare lo stato corrente di una corsa di un programma. Per fare ciò, sembra che sia necessario essere in grado di scorrere tutte le variabili in ambito.Come si accede alla tabella dei simboli in Ruby?

+1

Se non ti dispiace mi chiede, che cosa stai usando questo per? – Geo

+0

Lo sto usando per questo: http://stackoverflow.com/questions/199603/how-do-you-stringize-serialize-ruby-code Fondamentalmente, nessuno ha risposto alla mia domanda abbastanza bene, quindi prima di offrire la taglia (che mi farebbe perdere il rep), ho pensato di scomporlo in questa sotto-domanda e capire la risposta da solo. –

risposta

6

Penso che provenga da uno sfondo perl e che vorrebbe ottenere tutte le variabili definite in uno script e serializzarle. In questo modo, quando caricherà il file, li riprenderà. Sto ancora cercando come ottenere un elenco delle variabili, ma la serializzazione verrà effettuata utilizzando Marshal.dump e la loro lettura verrà eseguita con Marshal.load. Modificherò il post una volta scoperto come ottenere un elenco di tutte le variabili definite.

EDIT: trovato!

È possibile ottenere un elenco di tutte le variabili chiamando questi metodi:

 
local_variables 
global_variables 

E se non l'hai già ottenuto il vostro codice di serializzazione, vorrei suggerire qualcosa di simile:

  • creare una classe o un'istanza di Struct che contiene un nome di variabile e il valore della variabile e li aggiunge in un array:
 

local_variables.each {|var| my_array << MyVarObject.new(var,eval(var)) } # eval is used to get the value of the variable 
 

e quindi serializzare la matrice:


data = Marshal.dump(my_array) 
File.open("myfile.ser","w") do |file| 
    file.puts data 
end
+0

Fai attenzione: devi inizializzare my_array al di fuori del ciclo e, di conseguenza, verrà incluso quando itererai su local_variables. Dovresti aggiungere "a meno che var == 'my_array'" appena prima della parentesi graffa di chiusura per ignorarlo. – Bkkbrad

+0

Naturalmente. Stavo solo mostrando frammenti. – Geo

0

Non credo che ci sia, ma si può sempre usare lo scarico/carico marshall.

4

Se ho capito la tua domanda correttamente - che si vorrebbe vedere tutti i simboli nel programma quindi il seguente dovrebbe fare il trucco:

puts Symbol.all_symbols.inspect 

Il metodo di classe “all_symbols” restituirà una matrice di ogni simbolo attualmente nel programma.

+0

Sì, questo è vero. È interessante notare che restituisce simboli che non sono definiti bene: 'ZZZ' non è definito. 'ZZZ; Symbol.all_symbols' include' ZZZ'. –