2009-10-22 17 views
5

Anoche, estaba pensando en lo que creo que son características avanzadas del lenguaje ruby, a saber, Continuations (callcc) y objetos vinculantes. Me refiero a avanzado porque tengo un fondo de oo langages de tipo estático (C#, Java, C++), descubrí el ruby ​​recientemente, por lo que estas características del lenguaje no me son muy familiares.Uso en el mundo real de objetos vinculantes en ruby ​​

Me pregunto qué podría ser el uso en el mundo real de estas características de langages. En mi experiencia, todo se podría hacer con oo langages escritos de forma estática, pero a veces no acepto muy inteligentemente. Creo que descubrí la belleza/interés de la lectura de continuación de ese bonito artículo de Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

Aún así, estoy perdido con el objeto Binding. ¿Puede alguien proporcionarme algunos ejemplos del mundo real de algo que se puede hacer inteligentemente con Objetos vinculantes pero no muy inteligentemente con lanzas que carecen del concepto de Unión rubí?

Estaba pensando en llevar algunos objetos a su estado inicial cuando algo sale mal durante un proceso largo, pero no estoy seguro de que esto pueda implementarse con el objeto Binding y creo que podría implementarse muy inteligentemente clonando objetos antes el procesamiento y reemplazo del objeto modificado con sus clones cuando algo sale mal durante el procesamiento. Entonces este no es un ejemplo válido, creo.

Gracias de antemano por su ayuda.

Respuesta

5

He usado la clase de unión para implementar un corte de depuración.

class Array 
    def debug binding 
    each do |arg| 
     puts "arg = #{eval(arg, binding).inspect}" 
    end 
    end 
end 

Usted puede usar esto para inspeccionar una lista de fragmentos de código Ruby junto con lo que cada fragmento de código devuelve:

# .. some hairy code you want to debug ... 
['user','current_resource', 'user.owns?(current_resource)'].debug(binding) 

que imprimirá

user = #<User id:1, username: 'joe', ... 
current_resource = #<Comment id:20, ... 
user.owns?(current_resource) = false 

Me resulta muy útil para depuración rápida.

que tenía que utilizar un objeto de vinculación para capturar el ámbito donde debug se llama para que pueda ser utilizado en el eval cuando debug es correr. Probablemente haya otras formas de implementar esto, pero usar el enlace fue fácil y rápido. También hay probablemente mejores ejemplos de qué objetos vinculantes son útiles para ...

+0

¡Gracias! ¡Esto es correcto! Implementar una característica de depuración parece ser un uso del objeto Enlace. Me pregunto si esta característica de depuración fue documentada como un ejemplo de enlaces en el libro de piquetas o no. ¿Puedes ver otros usos de objetos vinculantes? –

+0

@dhruv Esto es bastante astuto. Creo que lo agregaré a mi paquete de utilidad, al lado de putsv (se pone verboso) etc ... ¡Gracias! – Ryanmt

8

objetos de unión son útiles cuando se desea evaluar ERB templates.

+1

¿Puede por favor elaborar un poco más? No entiendo a qué te refieres. –

+2

@SylvainPrat: El método de resultado ERB # toma un objeto 'Binding'. Puede obtenerlo simplemente usando el método Kernel 'binding', llamado directamente como' my_template.result (binding) '- que ejecuta el código Ruby en la plantilla con el contexto actual) –

1

Eche un vistazo a http://www.seaside.st/, es un framework de aplicaciones web smalltalk. Utiliza continuaciones extensivamente. El mejor ejemplo del mundo real sobre cómo usarlo, es este CMS http://www.cmsbox.com/en/cms

+0

Gracias por la respuesta, pero mi pregunta era más sobre el objeto vinculante que la continuación;) –

Cuestiones relacionadas