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.
Précédent : GDU : Modules Suivant : GDU : Variables


