Ruby – Procs

r1
Cos’è una proc? Possiamo prendere un pezzo di codice, compreso tra do e end e assegnarlo a una variabile. Questa variabile può essere usata, passata come argomento e così via, abbiamo creato una proc.
Le proc sono come le funzioni, con una differenza: sono oggetti. Vediamo un esempio (proc.rb):

#!/usr/bin/ruby
# encoding: UTF-8

# proc.rb

say_hello = Proc.new do
    puts "Hello world!"
end

say_hello.call
say_hello.call
#

proc

La proc viene definita alle righe 6-8, definendo una variabile (say_hello nel nostro caso) uguale a una nuova proc.

Potrà così essere chiamata (cioè eseguita) tutte e volte che vogliamo, righe 10 e 11.

Naturalmente per essere utile una proc deve poter essere flessibile, ecco come passarle parametri (proc1.rb):

#!/usr/bin/ruby
# encoding: UTF-8

# proc.rb

say_hello_to = Proc.new do |nome|
    puts "Hello #{nome}!"
end

say_hello_to.call "Janet"
say_hello_to.call "Juhan"
#

proc1

OK? Se avete letto i post precedenti non dovrebbero esserci cose nuove, la sintassi è quella usuale.

Passare proc ai metodi

In Ruby tutto è un oggetto (cit.), anche le proc, per cui possono essere passate ai metodi, esempio (ptom.rb):

#!/usr/bin/ruby
# encoding: UTF-8

# ptom.rb --proc to method

def esegui_proc una_proc
    una_proc.call
end

say_hello = Proc.new do
    puts "Hello world!"
end

esegui_proc say_hello
#

ptom

Alle righe 4-6 creiamo il metodo esegui_proc che ha un parametro; niente di nuovo, sembra. No aspetta: il parametro è una proc, quella definita alle righe 10-12.

E la chiamata al metodo di riga 14 passa il parametro (cioè il nome della proc) nel modo usuale.
Se ci pensate un attimo vedrete che non poteva che essere così: in Ruby tutto è un oggetto (cit.)!

Proc come risultato di una funzione

O, come si dice normalmente, funzione ritornante una proc.
Abbiamo appena visto che una proc può essere passata a una funzione (nota: in Ruby “funzione” è spesso usata al posto di “metodo”, prassi corretta tranne nel caso in cui possa creare confusione) come parametro. Ma vediamo il caso opposto, cioè la funzione ce ritorna una proc (ret_p.rb):

#!/usr/bin/ruby
# encoding: UTF-8

# ret_p.rb

def return_proc
    Proc.new do |nome|
        puts "La lunghezza di #{nome} è #{nome.length}"
    end
end

lun_nome = return_proc
lun_nome.call "Juhan van Juhan"
#

ret_p

La funzione return_proc (righe 6-10) definisce una proc senza nome. Ma è il valore che la funzione ritorna (piccolo ripassino: in Ruby una funzione ritorna il valore dell’ultima espressione, come in Lisp).

Per cui alla riga 12 assegniamo il nome lun_nome all’oggetto ritornato dalla funzione return_proc. Alla riga 13 infine chiamiamo la proc con il nome che le abbiamo assegnato alla riga precedente.
Quest’ultimo esempio, secondo me, va esaminato attentamente perché c’è dentro tutta la filosofia di Ruby. E le sue capacità. E se non rischiassi di essere considerato ripetitivo direi che questo è possibile perché in Ruby tutto è un oggetto (cit.) 😉

OPS! il widget di WordPress, ottimo, ha un piccolo baco: se nell’ultima riga c’è un _ (underscore, trattino-basso) questo non viene visualizzato.
Per questo ho inserito un # commento  alla fine di qualche script 😳

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: