.. la verità è che mi sento uno straccio, e domattina mi devo svegliare presto, quindi mi son rifiutato din andare al concerto di una cover band dei pink floyd.

Colgo l’occasione per giocare un po’ con rhymes, perché sono io che l’ho aizzato a fare certe cose..

Ecco quindi, in tutta la loro gloria, l’ftp uploader ed il webserver in ruby.

Il codice per fare upload di un file in ftp è facilissimo:

require \"net/ftp\"
Net::FTP.new(\"host\") do |ftp|
  ftp.login(\"user\", \"pass\")
  ftp.chdir(\"remotepath\")
  ftp.put(\"localfile\")
end

sostanzialmente è identico a quello di lawrence, con una differenza chiave, l’uso del blocco. In ruby quando si lavora con una classe che rappresenta una risorsa da liberare (un file, un socket, una connessione al database etc) esiste questo idioma del passare un blocco al metodo di creazione della stessa.
Il metodo sarà implementato più o meno così:

 def initialize(argomenti)
  acquisisci risorsa
  yield self if block_given?
 ensure
  libera risorsa
 end

ensure è equivalente a finally in py/java/etc.
Notate che quando si gestiscono eccezioni in un metodo è il corpo stesso del metodo che funziona da contenitore, e quindi non si deve specificare un ulteriore blocco interno (il try: in python).

Il significato dell’idioma è insomma il fatto che non c’è bisogno di gestire esplicitamente ogni volta la liberazione delle risorse o la gestione delle eccezioni, in quanto il metodo se ne occuperà al posto nostro se gli passiamo un blocco.
Siamo sinceri, è una cosa copiata dal Lisp, come al solito, ma d’altronde è un’idea talmente buona che in qualche modo la sta introducendo anche Guido.

Ma passiamo al webserver.
Credo che il modulo per costruire semplici server in ruby sia copiat^Wispirato a quello di python, e facendo un port linea per linea il codice risultante sarebbe troppo simile.
Ma ruby è TIMTOWTDI, quindi si può semplificare:

require \"webrick\"
	
# default porta 80
srv = WEBrick::HTTPServer.new
	
srv.mount_proc(\"/\") do |req, res|
 res.body = \"<html><body><h1>This is the HTML body</h1></body></html>\"
end
srv.start

notate che si usa un blocco pure qui.
I blocchi sono d’altronde un concetto talmente generico che risultano utili in ogni situazione :)