Probablemente hay dos diferencias principales:
Ruby tiene cierres elegantes y anónimos.
Rails los usa con buenos resultados. He aquí un ejemplo:
class WeblogController < ActionController::Base
def index
@posts = Post.find :all
respond_to do |format|
format.html
format.xml { render :xml => @posts.to_xml }
format.rss { render :action => "feed.rxml" }
end
end
end
Los cierres / lambdas anónimos facilitan la emulación de nuevas funciones de lenguaje que tomarían bloques. En Python, existen cierres, pero deben tener un nombre para poder usarse. Entonces, en lugar de poder usar cierres para emular nuevas funciones de lenguaje, se ve obligado a ser explícito sobre el hecho de que está utilizando un cierre.
Ruby tiene una metaprogramación más limpia y fácil de usar.
Esto se usa mucho en Rails, principalmente por lo fácil que es de usar. Para ser específico, en Ruby, puede ejecutar código arbitrario en el contexto de la clase. Los siguientes fragmentos son equivalentes:
class Foo
def self.make_hello_method
class_eval do
def hello
puts "HELLO"
end
end
end
end
class Bar < Foo # snippet 1
make_hello_method
end
class Bar < Foo; end # snippet 2
Bar.make_hello_method
En ambos casos, puede hacer:
Bar.new.hello
que imprimirá "HOLA". losclass_eval
método también toma un String, por lo que es posible crear métodos sobre la marcha, a medida que se crea una clase, que tienen una semántica diferente según los parámetros que se pasan.
De hecho, es posible hacer este tipo de metaprogramación en Python (y también en otros lenguajes), pero Ruby tiene una ventaja porque la metaprogramación no es un estilo especial de programación. Se deriva del hecho de que en Ruby todo es un objeto y todas las líneas de código se ejecutan directamente. Como resultado, los Class
es en sí mismos son objetos, los cuerpos de clase tienen un self
apuntador a la clase y puede llamar a métodos en la clase mientras crea uno.
Esto es en gran medida responsable del grado de declaratividad posible en Rails y de la facilidad con la que podemos implementar nuevas características declarativas que parecen palabras clave o nuevas características de lenguaje de bloques.