¿Cómo clasifico una lambda(Proc) en Ruby?
serialization proc-object (6)
Prueba ruby2ruby
Joe Van Dyk le preguntó a la lista de correo de Ruby :
Hola,
En Ruby, supongo que no puedes ordenar un objeto lambda / proc, ¿verdad? ¿Es posible en lisp u otros idiomas?
Lo que estaba tratando de hacer:
l = lamda { ... }
Bj.submit "/path/to/ruby/program", :stdin => Marshal.dump(l)
Entonces, estoy enviando a BackgroundJob un objeto lambda, que contiene el contexto / código de qué hacer. Pero, supongo que eso no fue posible. Terminé ordenando un objeto de rubí normal que contenía instrucciones sobre qué hacer después de ejecutar el programa.
Joe
también podría simplemente ingresar su código como una cadena:
code = %{
lambda {"hello ruby code".split(" ").each{|e| puts e + "!"}}
}
luego ejecútalo con eval
eval code
que devolverá un rubí lamda.
usar el formato %{}
escapa de una cadena, pero solo se cierra en una llave no igualada. es decir, puede anidar llaves como esta %{ [] {} }
y todavía está encerrado.
la mayoría de los resaltadores de sintaxis de texto no se dan cuenta de que se trata de una cadena, por lo que aún muestran resaltado de código regular.
No puede ordenar un Lambda o Proc. Esto se debe a que ambos se consideran cierres, lo que significa que se cierran alrededor de la memoria en la que se definieron y pueden hacer referencia a ellos. (Para ordenarlos, tendrías que utilizar toda la memoria a la que pudieran acceder en el momento en que fueron creados).
Sin embargo, como señaló Gaius, puedes usar ruby2ruby para obtener la cadena del programa. Es decir, puede ordenar la cadena que representa el código ruby y luego reevaluarlo más tarde.
He encontrado proc_to_ast para hacer el mejor trabajo: https://github.com/joker1007/proc_to_ast .
Funciona con seguridad en ruby 2+, y he creado un PR para la compatibilidad con ruby 1.9.3+ ( https://github.com/joker1007/proc_to_ast/pull/3 )
Si el proceso se define en un archivo, U puede obtener la ubicación del archivo de proc, luego serializarlo, luego, después de deserializar, usar la ubicación para volver al proceso nuevamente.
proc_location_array = proc.source_location
después de deserializar:
file_name = proc_location_array [0]
line_number = proc_location_array [1]
proc_line_code = IO.readlines (file_name) [line_number - 1]
proc_hash_string = proc_line_code [proc_line_code.index ("{") .. proc_line_code.length]
proc = eval ("lambda # {proc_hash_string}")
Si está interesado en obtener una versión de cadena de código Ruby usando Ruby2Ruby, es posible que le guste este hilo .