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 .