Oggetti Procedura

Spesso è desiderabile essere in grado di specificare reazioni ad eventi inaspettati . Come si vedrà, questo viene fatto nella maniera più semplice potendo passare dei blocchi di codice come argomenti ad altri metodi, il che significa essere in grado di trattare il codice come se si trattasse di dati .

Un nuovo oggetto procedura viene creato usando proc:

ruby> quux = proc {
    |   print "QUUXQUUXQUUX!!!"
    | }
   #<Proc:0x4017357c>

Ora ciò a cui si riferisce quux è un oggetto , e come la maggior parte degli oggetti , ha un comportamento che può essere invocato. Specificamente, possiamo chiedergli di eseguirsi, tramite il metodo call:

ruby> quux.call
QUUXQUUXQUUX!!!
   nil

Dunque, dopo tutto ciò, quux può essere usato come argomento per un metodo ? Certo .

ruby> def esegui( p )
    |   print "Sto per chiamare una procedura..."
    |   p.call
    |   print "ecco: finito."
    | end
   nil
ruby> esegui quux
Sto per chiamare una procedura...
QUUXQUUXQUUX!!!
ecco: finito.
   nil

Il metodo trap ci lascai assegnare una risposta di nostra scelta ad ogni segnale del sistema.

ruby> gestoreInt = proc{ print "premuto ^C ." }
   #<Proc:0x401730a4>
ruby> trap "SIGINT" , gestoreInt
   #<Proc:0x401735e0>

Normalmente premere ^C fa terminare l'interprete. Ora viene mostrato un messaggio e l'interprete continua a funzionare , dunque non perderete il alvoro che stavate facendo. (non siete inrappolati nell'interprete per sempre; potete ancora uscirne scrivendo exit o premendo ^D.)

una nota finale prima di proseguire con altri argomenti : non è strettamente necessario fornire ad un oggetto di tipo procedura un nome prima di collegarlo ad un segnale. Una procedura anonima equivalente apparirebbe così:

ruby> trap "SIGINT" , proc{ print "premuto ^C ." }
   nil

O in maniera ancora più compatta ,

ruby> trap "SIGINT" , 'print "premuto ^C ."'
   nil

Queta forma abbreviata fornisce una certa covenienza ed una certa maggior leggibilità nello scrivere piccole procedure anonime .

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Luca
Ti è piaciuto l'articolo?