2009-02-02 23 views
7

¿Hay alguna manera de acceder a todo en la tabla de símbolos en Ruby? Quiero poder serializar o guardar el estado actual de una ejecución de un programa. Para hacer esto, parece que necesito poder iterar sobre todas las variables en el alcance.¿Cómo se accede a la tabla de símbolos en Ruby?

+1

Si no importa que pregunte, ¿qué estás usando esto? – Geo

+0

Lo estoy usando para esto: http://stackoverflow.com/questions/199603/how-do-you-stringize-serialize-ruby-code Básicamente, nadie respondió mi pregunta lo suficientemente bien, así que antes de ofrecer recompensa (que me haría perder representante), pensé en dividirlo en esta subpregunta y encontrar la respuesta yo mismo. –

Respuesta

6

Creo que proviene de un fondo perl, y que le gustaría obtener todas las variables definidas en un script y serializarlas. De esta forma, cuando cargue el archivo, él los recuperará. Todavía estoy buscando información sobre cómo obtener una lista de las variables, pero la serialización se realizará utilizando Marshal.dump y su lectura se realizará con Marshal.load. Editaré la publicación una vez que descubra cómo obtener una lista de todas las variables definidas.

EDIT: lo encontró!

Usted puede obtener una lista de todas las variables por llamar a estos métodos:

 
local_variables 
global_variables 

Y si aún no lo ha conseguido su código de serialización, sugeriría algo como esto:

  • crear una clase o instancia de Struct que contiene un nombre de variable y el valor de la variable y los agrega en una matriz:
 

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

y luego serializar la matriz:


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

Tenga cuidado: debe inicializar my_array fuera del ciclo, y como resultado se incluirá cuando itere sobre local_variables. Debería agregar "a menos que var == 'my_array'" justo antes de cerrar la llave para ignorarlo. – Bkkbrad

+0

Por supuesto. Solo estaba mostrando fragmentos. – Geo

0

No creo que exista, pero siempre se puede usar marshall volcado/carga.

4

Si he entendido su pregunta correctamente - que le gustaría ver a todos los símbolos en su programa a continuación, el siguiente debe hacer el truco:

puts Symbol.all_symbols.inspect 

El método de la clase “all_symbols” va a devolver una matriz de cada Símbolo actualmente en el programa.

+0

Sí, esto es cierto. Curiosamente, devuelve símbolos que no están definidos también: 'ZZZ' no está definido. 'ZZZ; Symbol.all_symbols' incluye' ZZZ'. –

Cuestiones relacionadas