Date un’occhiata anche a Ruby For Pythonista: Le Librerie. Un’altro confronto (in inglese) è qui
Perdonate le inesattezze e vogliate correggerle quando le notate. In realtà ruby e python sono talmente diversi da essere identici. Se avete dei dubbi su come venga realizzato un determinato meccanismo/comportamento in ruby chiedete in mailing list o su questa pagina
Questa pagina e’ dedicata a chi ama python, ma non e’ un fondamentalista. Con cio’ intendo dire che mentalita’ del tipo- python mi piace
- python e’ adatto a quello che faccio
- amo tutti i linguaggi
- ho sentito dire che ruby e’ un bel linguaggio
- python e’ il miglior linguaggio che conosco
sono ok.
Al contrario approcci come- python e’ perfetto
- non ne ho mai provato un altro ma so che gli altri fanno schifo
- le feature di qualsiasi altro linguaggio sono inutili
- python ha tutto quello che voglio e tutti i vari esempi di BLUB Paradox non sono ok.
Io posso cercare di spiegare solo se siete disposti ad imparare :)
Similitudini
Ruby e python sono simili soprattutto nello spirito. Entrambi:- sono semplici
- sono pragmatici
- permettono di programmare in stile OO
- permettono di programmare in stile procedurale
- permettono di programmare in stile funzionale
- hanno una libreria molto vasta e potente
- sono molto compatti
- hanno strutture dati di alto livello integrate (Hash, Array dinamici)
- hanno vari meccanismi di metaprogrammazione
Ciò fa si che lo stile con cui viene scritto un programma in python ed in ruby sia in realtà molto simile, così come sono simili le tecniche che si apprendono nel processo.
Differenze
ruby e python differiscono fondamentalmente come storia, e sono un interessante esempio di affinita’ elettive. Solitamente si pensa che python sia nato come linguaggio procedurale, la verità, è che Python era OO sin dalla prima versione, come ruby. Si veda questo articolo. Quello che è vero che nelle prime versioni la OOP in python non era pervasiva, ad esempio non si potevano creare sottoclassi dei tipi builtin, e che l’idea di “oo puro” è stata raggiunta solo nella versione 2.2.
Nel contempo, scelte come le variabili di classe locali alla classe, sono state introdotte in ruby in seguito (inizialmente esse erano condivise dalle sottoclassi) mentre erano già nella prima OO in python.
In ordine sparso:- Python ha funzioni e oggetti nello stesso namespace
- In ruby le funzioni esistono solo come messaggi ad oggetti
- Ruby ha i blocchi, che sono lambda come quelle del LISP
- In ruby si possono cambiare gli oggetti base in python no
- Alcune cose sembrano arbitrarie in python (i.e. il
self) e hanno una logica in ruby - .. e viceversa :)
- In ruby tutto e’ un’espressione
- Gli iteratori in ruby sono basati su metodi anonimi, in python sono semicoroutine
- In ruby esiste un vero controllo d’accesso (privato/pubblico/protetto) anche se aggirabile
- Python ha le list comprehension che in ruby vengono sostituite dai blocchi.
- Ruby ha continuazioni manipolabili (first class reified continuation)
- Python ha l’ereditarieta’ multipla
- Ruby ha i Mixin
- Python ha i keyword argument
- In ruby non esistono classi vecchio e nuovo stile, ne’ descrittori.
- I blocchi in ruby coprono le funzionalita’ che in python sono sparse tra iteratori, lambda, funzioni e list comprehension.
- In python si usano i descrittori per creare metodi di classe(
classmethod(foo)), in ruby si tratta di metodi singleton (def self.foo). - In python un oggetto e’ fondamentalmente un dizionario.
- In ruby tutti gli oggetti sono mutabili, ma possono essere bloccati con
freeze() - In ruby si puo’ usare qualsiasi cosa come chiave di un dizionario (
Hash) - in ruby ogni metodo ha un parametro implicito che rappresenta l’oggetto (“
self“) e non esistono funzioni al di fuori di un oggetto. - ..mentre in python le funzioni possono esistere da sole, ed i metodi sono funzioni che al momento della chiamata ricevono un argomento esplicito che rappresenta l’oggetto.
- ruby ha un sistema di sicurezza builtin, i SAFE level che permette di isolare parti di un programma da dati pericolosi e di eliminare alla radice comportamenti a rischio (in python esistevano moduli analoghi, bastion ed rexec che sono stati abbandonati perché insicuri)
Vedere anche Classi a Runtime in Ruby e Python