Scuse Frequenti

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Spesso parlando di Ruby con qualcuno ci si sente dire ‘Si, userei ruby ma..’ Ebbene, questa pagina vuole essere una raccolta di scuse frequenti. Ci sono ottimi motivi per non usare Ruby, e soprattutto se nel vostro linguaggio preferito ci sono gia’ tutte le cose di cui avete bisogno, non avrete bisogno di cambiarlo.

Ma se vorreste cambiare e non lo fate per questi motivi.. beh, sono solo scuse ;P

...tutte quelle variabili alla Perl!

In ruby esistono le variabili stile perl come $\ , $_ ,$~ e’ vero. D’altronde l’uso di queste variabili e’ fortemente scoraggiato, ed e’ possibile farne a meno senza alcun problema. Ad esempio, facendo un grep '\$' * sulla libreria YAML.rb si scopre che ci sono 36 righe con un dollaro su 1910 righe di codice. E non dimenticate che con il dollaro si indicano tutte le variabili globali ed e’ un metacarattere molto comune nelle Regexp. Alcune variabili globali hanno comunque un alias, per esempio $: è lo stesso di $LOAD_PATH. (Altre variabili predefinite)

...i ritorni impliciti!

Alcuni ritengono che
 def met(x,y)
  return x,y
 end
sia molto piu’ chiaro di
 def met(x,y)
  x+y
 end
forse e’ cosi’.. ma potete usare tranquillamente quello che preferite :)

...ma le variabili globali con il dollaro davanti fanno tanto line noise!

Vero, sono pensate in modo da scoraggiarne l’uso. I programmi in ruby, molto spesso, usano pochissime o nessuna variabile globale. Le variabili globali, spesso sono causa di bug subdoli e andrebbero evitate in qualsiasi linguaggio, in Ruby, se ne scoraggia l’uso implicitamente. Per evitare il fastidio visivo, basta fare la cosa giusta: Raccogliere le variabili in un modulo o classe, usare una costante se possibile, usare una variabile locale.

...ma e’ completamente ad oggetti!

Essere ad oggetti non implica che bisogni scrivere codice in stile OO.

questo e’ comune codice procedurale:
 def doppio(x)
  return x*2
 end

 val=gets
 puts(doppio(val))
e lo stesso si puo’ fare anche per codice in stile funzionale.

...ma non supporta il paradigma funzionale!

Vero, ruby e’ a oggetti, punto. Ma una delle principali fonti di ispirazione per ruby e’ LISP. Questa pagina potrebbe convincervi :)

...si possono modificare le classi! E’ insicuro!

D’altronde, anche in C si puo’ mettere in un header
 #define char int
ma nessuno si sogna di farlo :)

Avere classi aperte e’ una cosa utile in quanto e’ possibile aggiungere delle funzionalita` alle classi base, evitando di doverle subclassare in molti casi. D’altronde, e’ piuttosto raro che qualcuno pensi di cambiare il comportamento di Array#sort() o String#== .

Spesso si sente dire che in progetti complessi avere le classi aperte sarebbe un problema: come fidarsi dei propri colleghi? Siamo seri: vi sembra ragionevole che qualcuno cambi il comportamento di Hash#length e il resto del team non lo sappia? ;)

Ok, vi sembra probabile. Beh con $VERBOSE=true (default in 1.8) ruby emette un warning nel caso di ridefinizione di un metodo. Oppure potete effettuare il freeze della classe e generare un eccezione in caso di modifica. Se siete ultraparanoici ( ma davvero ultra) potete settare $SAFE=4 e ottenere ancora una bella eccezione :)

Da notare anche che un comportamento simile a quello di Ruby e’ permesso anche da SmallTalk dall’ObjectiveC e da Python (per alcuni oggetti), eppure ci sono diversi progetti che li usano e funzionano egregiamente..

... ma ci sono poche librerie!

Di quale in particolare senti il bisogno? Esistono numerosi binding a GUI (GTK,wxWindows,FOX,TK,FLTK etc..), molti dbms, librerie per lo sviluppo web, xml, SOAP,XML-RPC, YAML, librerie di rete, parser lessicali/sintattici, OLE, COCOA, POSIX, librerie per la creazione di PDF/XSL/RDF/SVG/immagini varie, per l’uso delle seriali o per le smartcard, per OpenGL, SDL

In ogni caso, provate a chiedere su comp.lang.ruby, e’ probabile che la libreria di cui avete bisogno esista gia`..

... ma nessuno usa davvero ruby! si tratta di un linguaggio giocattolo!

NASA, Motorola, Siemens, Lucent sono solo alcuni dei nomi che si possono leggere questa pagina, dove sono raccolte delle ‘storie di successo’ relative all’uso di Ruby. Ma il punto e’ un altro: cosa importa se altri usano/non usano ruby, se IO posso essere piu’ produttivo usandolo?

... ma senza unicode cosa posso fare se devo supportare più lingue e charset?

Ruby di per se è in grado di gestire internamente file (compresi i sorgenti) in 4 encoding differenti: ASCII, UTF-8, EUC e SHIFT-JIS. Questo supporto si estende ovviamente alle espressioni regolari, ed è generalmente sufficiente per molte applicazioni multilingue, specie se web. La libreria jcode, fornita con ruby, si occupa di specializzare le funzionalità della classe String per questi encoding . In pratica, ruby non ha una gestione nativa di unicode, prevista per le prossime versioni, però con un po’ di attenzione si dovrebbe riuscire a lavorare. Per esempio:


#!/usr/bin/env ruby
# Questo file è salvato in utf-8
$KCODE = 'u'
require 'jcode'
s = "10 €" 
puts s.length # Stampa 6
puts s.jlength # Stampa 4
# EOF

Ruby viene inoltre distribuito con binding per iconv che permette di effettuare trasformazioni non-lossy tra un centinaio di altri.

... ma è lento!

È vero nulla è gratis, ma spesso questo non è determinante, in alcuni casi si potrebbe scegliere di aggirare questa situazione con il caching oppure realizzando alcune parti in C.

Updated on July 13, 2006 23:44 by Luigi Maselli (87.0.171.206)