Pregunta

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

Me pregunto cuál podría ser el uso en el mundo real de estas características de lenguaje. En mi experiencia, todo se podría hacer con lenguajes oo tipificados estáticamente, pero a veces no estoy de acuerdo con mucha inteligencia. Creo que me di cuenta de la belleza / interés de Continuation leyendo ese 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 pueda hacer de forma inteligente con el objeto Binding pero no de forma muy inteligente con los idiomas que faltan en el concepto Binding de rubí?

Estaba pensando en hacer retroceder algunos objetos a su estado inicial cuando algo va mal durante un proceso de ejecución prolongada, pero no estoy seguro de que esto pueda implementarse con el objeto Binding y creo que podría implementarse de manera muy inteligente mediante la clonación de objetos antes del procesar y reemplazar el objeto modificado con sus clones cuando algo sale mal durante el procesamiento. Así que este no es un ejemplo válido, creo.

Gracias de antemano por tu ayuda.

¿Fue útil?

Solución

He usado la clase de enlace para implementar un hack de depuración.

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

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

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

que se imprimirá

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

Lo encuentro muy útil para la depuración rápida.

Necesitaba usar un objeto de enlace para capturar el ámbito donde se llama a debug , por lo que se puede usar en el eval cuando debug es correr. Probablemente haya otras formas de implementar esto, pero usar el enlace fue fácil y rápido. Probablemente también hay ejemplos mucho mejores de qué objetos de enlace son útiles para ...

Otros consejos

Los objetos vinculantes son útiles cuando desea evaluar plantillas ERB.

Eche un vistazo a http://www.seaside.st/ , es una aplicación web pequeña. marco de referencia. Utiliza continuaciones extensivamente. El mejor ejemplo del mundo real sobre cómo usarlo, es este CMS http://www.cmsbox.com/en / cms

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top