Objets procédure

l est souvent souhaitable de pouvoir spécifier les réponses à des événements inattendus. Il s’avère que c’est plus facile si nous pouvons passer des blocs de code en argument à d’autres méthodes, ce qui veut dire être capables de traiter du code comme si c’était de la donnée.

Un nouvel objet procédure est formé en utilisant proc :

ruby> quux = proc {
   |   print "QUUXQUUXQUUX !!!\n" 
   | }
  #

Ce à quoi quux se réfère est un objet, et comme la plupart des objets, il a un comportement qui peut être invoqué. En particulier, nous pouvons lui demander de s’exécuter, via sa méthode call :

ruby> quux.call
QUUXQUUXQUUX!!!
  nil

Bon, et avec tout ça, est-ce que quux peut être utilisé comme argument d’une méthode ? Bien sûr.

ruby> def run( p )
   |   print "Je suis sur le point d'appeler une procédure...\n" 
   |   p.call
   |   print "Ca y est, c'est fait.\n" 
   | end
  nil
ruby> run quux
Je suis sur le point d'appeler une procédure...
QUUXQUUXQUUX!!!
Ca y est, c'est fait.
  nil

La méthode trap nous permet d’assigner la réponse de notre choix à n’importe quel signal du système.


 ruby> gestion_d_interruption = proc{ print "On a tapé Ctrl-C.\n" }
   #<Proc:0x401730a4>
 ruby> trap "SIGINT", gestion_d_interruption
   #<Proc:0x401735e0>

Normalement, quand on tape Ctrl-C, on sort de l’interpréteur. Maintenant, un message apparaît et l’interpréteur continue de tourner, si bien que vous ne perdez pas le travail en cours. (Vous n’êtes pas coincé dans l’interpréteur à vie, vous pouvez encore sortir en tapant exit ou Ctrl-D.)

Un dernier mot avant de passer à un autre sujet : il n’est pas strictement nécessaire de donner un nom à une procédure avant de l’associer à un signal. Un objet procédure anonyme pourrait ressembler à :

ruby> trap "SIGINT", proc{ print "On a tapé Ctrl-C.n" }
  nil

ou même, encore plus compact :

ruby> trap "SIGINT", 'print "On a tapé Ctrl-C.n"'
  nil

Cette forme abrégée est commode et lisible pour écrire de très petites procédures anonymes.

Guide de l’utilisateur

Précédent : GDU : Modules Suivant : GDU : Variables