Ruby vs Python (era: Comentarios sobre web frameworks)

Esteban Manchado Velázquez zoso en foton.es
Dom Sep 25 17:12:05 CEST 2005


Hola:

On Fri, Sep 23, 2005 at 10:05:15AM +0200, Chema Cortes wrote:
> Víctor R. Ruiz escribió:
> 
> >   Hay una comparativa bastante concienzuda entre Ruby y Python en 
> > http://blog.ianbicking.org/ruby-python-power.html La opinión de Mr. Guido, 
> > según cuentan en http://aws.typepad.com/aws/2005/01/amazon_devcon_g_5.html, 
> > es: «Asked about Ruby, Guido thought that it "seems like an accident attempt 
> > in cleaning up Perl". He disliked the perlesque parts of Ruby and claimed 
> > that the semantics of Ruby code blocks is not always clear».

   Paso de comentar la frase de Guido ;-)

> Es una comparativa bastante buena, aunque tendría que leerla con más
> detalle.
> 
> Se deja algunas cosas como que ruby no tiene herencia múltiple o que
> puede cargar directamente librerías dinámicas, lo que hace más sencillo
> crear módulos externos.

   Sobre lo de la herencia múltiple, comentar que la técnica de Mixin (que
tengo entendido que se puede hacer en Python, pero en Ruby se usa mucho)
permite hacer las cosas más comunes que se buscan con herencia múltiple (y en
opinión de algunos, de manera más clara).

   P.ej., hay un módulo llamado Enumerable, que tiene métodos como «map»,
«include?», «find_all», «detect», «inject», etc. que se puede «mezclar» con
cualquier clase que tenga el método «each», y «mágicamente» aparecen todos
esos métodos. Lo que se gana en claridad es que Enumerable es un módulo, no
una clase, y que la forma de incorporar los métodos del mismo en una clase es
como el Mixin, lo que deja clara la intención del módulo Enumerable (no usarse
como una clase, sino ser un conjunto de métodos para añadir a otras clases) y
de la llamada «include Enumerable».

   Lo de cargar módulos dinámicos no lo entiendo, ¿a qué te refieres? ¿En
Python no puedes hacer "import foo" y que "foo" sea un "foo.so" en algún
sitio?

> En cuanto a la sintaxis de ruby, es algo liosa, como siempre depende del
> gusto de cada cuál. Hay cosas que cambiaría tanto en la sintaxis de ruby
> como en la de python, pero en comparación me parece la sintaxis de ruby
> más propensa a cometer errores. Voy a poner dos ejemplos de cada uno
> (considerados como "verrugas" (warts) del lenguaje):
> [...]
> En ruby:
> 
> def a() 100 end
> puts a   # --> 100
> a=1
> puts a   # --> 1
> def b() a end
> puts a,a(),b   # --> 1,100,100
> 
> LLega un momento en que no sabes si 'a' es una variable o una función,
> ni porqué la función 'b' utiliza la 'función-a' y no la 'variable-a',
> más aún si supones, erróneamente, que la variable debería suplantar a la
> función.

   Otro par de apuntes sobre esto:

   1) Normalmente en Ruby todo lo programas orientado a objetos, con lo que
ese caso no es muy común (los «atributos» del objeto serían «@a», no «a», que
sería una variable local). Y como no se puede acceder desde fuera a los
atributos de un objeto (sólo se puede llamar a métodos), sabes positivamente
que todo lo que se llamaría desde fuera serían siempre métodos.
   2) El principal problema de legibilidad y mantenimiento de ese trozo de
programa, es, precisamente, llamar de la misma manera a dos cosas distintas
:-) No veo la ventaja de que se pueda hacer lo que tú esperas, tal como lo
haces: normalmente en Ruby eso serían métodos, no variable y funciones (o
atributos llamables o no, en mentalidad Python), y redefinir métodos es
trivial, así que seguramente el ejemplo no es muy real...

   Saludos,

-- 
Esteban Manchado Velázquez <zoso en foton.es> - http://www.foton.es
EuropeSwPatentFree - http://EuropeSwPatentFree.hispalinux.es




Más información sobre la lista de distribución Python-es