Il existe probablement deux différences majeures:
Ruby a des fermetures élégantes et anonymes.
Les rails les utilisent à bon escient. Voici un exemple:
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
Les fermetures / lambdas anonymes facilitent l'émulation de nouvelles fonctionnalités de langage qui prendraient des blocs. En Python, les fermetures existent, mais elles doivent être nommées pour être utilisées. Ainsi, au lieu de pouvoir utiliser des fermetures pour émuler de nouvelles fonctionnalités de langage, vous êtes obligé d'être explicite sur le fait que vous utilisez une fermeture.
Ruby a une métaprogrammation plus propre et plus facile à utiliser.
Ceci est largement utilisé dans Rails, principalement en raison de sa facilité d'utilisation. Pour être précis, dans Ruby, vous pouvez exécuter du code arbitraire dans le contexte de la classe. Les extraits de code suivants sont équivalents:
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
Dans les deux cas, vous pouvez alors faire:
Bar.new.hello
qui imprimera "HELLO". La class_eval
méthode prend également une chaîne, il est donc possible de créer des méthodes à la volée, lors de la création d'une classe, qui ont une sémantique différente en fonction des paramètres transmis.
Il est, en fait, possible de faire ce genre de métaprogrammation en Python (et dans d'autres langages aussi), mais Ruby a une longueur d'avance car la métaprogrammation n'est pas un style de programmation particulier. Cela découle du fait que dans Ruby, tout est un objet et toutes les lignes de code sont directement exécutées. En conséquence, Class
es sont eux-mêmes des objets, les corps de classe ont unself
pointant sur la classe et vous pouvez appeler des méthodes sur la classe lorsque vous en créez une.
Ceci est en grande partie responsable du degré de déclarativité possible dans Rails et de la facilité avec laquelle nous sommes en mesure d'implémenter de nouvelles fonctionnalités déclaratives qui ressemblent à des mots-clés ou à de nouvelles fonctionnalités de langage de blocs.