Tutorial de Ruby – Parte 22 – Objetos promedios

Capítulo 19. Objetos procedimiento

 

A menudo es deseable tener la posibilidad de definir respuestas específicas a sucesos inesperados. Resulta que esto se consigue con gran sencillez si podemos pasar un bloque de código a otros métodos, lo que significa que deseamos tratar el código como si fuesen datos.

 

Un objeto procedimiento nuevo se obtiene utilizando proc:

 

ruby> quux = proc {

ruby| print «QUUXQUUXQUUX!!!\n»

ruby| }

#<Proc:0x401c4884>

 

Ahora quux referencia a un objeto y como las mayoría de los objetos, tiene un comportamiento que se puede invocar.

 

Concretamente, podemos pedir que se ejecute a través de su método call

 

ruby> quux.call

QUUXQUUXQUUX!!!

nil

 

Luego, después de todo esto. ¿Podemos utilizar quux cómo un argumento de un método? Ciertamente.

 

ruby> def run ( p )

ruby| print «Vamos a llamar a un procedimiento … \n»

ruby| p.call

ruby| print «Finalizado. \n»

ruby| end

nil

ruby> run quux

 

Vamos a llamar a un procedimiento …

QUUXQUUXQUUX!!!

Finalizado.

nil

 

El método trap nos permite asignar una respuesta personalizada a cualquier señal del sistema.

 

ruby> inthandler = proc{ print «^C ha sido pulsado.\n» }

#<Proc:0x401c4104>

ruby> trap «SIGINT», inthandler

nil

 

Normalmente, al pulsar ^C se sale del intérprete. Ahora se imprime un mensaje y el intérprete sigue ejecutándose, así no se pierde el trabajo realizado. (No nos encontramos atrapados en el intérprete para siempre; todavía se puede salir tecleando exit o pulsando ^D.)

 

Una observación final antes de pasar a otros temas: no es necesario dar al objeto procedimiento un nombre antes de asociarlo a una señal. Un objeto procedimiento anónimo equivalente se asemejaría a:

 

ruby> trap «SIGINT», proc{ print «^C ha sido pulsado.\n» }

#<Proc:0x401c4104>

 

O de una forma más compacta todavía,

 

ruby> trap «SIGINT», ’print «^C ha sido pulsado.\n»’

#<Proc:0x401c3d44>

 

Este formato abreviado es mas adecuado y legible cuando se escriben pequeños procedimientos anónimos.

Gus Terrera

Apasionado por el agile testing y la ia.

Deja una respuesta