Es gibt wahrscheinlich zwei Hauptunterschiede:
Ruby hat elegante, anonyme Verschlüsse.
Rails nutzt sie effektiv. Hier ist ein Beispiel:
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
Anonyme Schließungen / Lambdas erleichtern die Emulation neuer Sprachfunktionen, die Blöcke benötigen würden. In Python gibt es Verschlüsse, die jedoch benannt werden müssen, um verwendet zu werden. Anstatt Verschlüsse zum Emulieren neuer Sprachfunktionen verwenden zu können, müssen Sie explizit angeben, dass Sie einen Verschluss verwenden.
Ruby hat eine sauberere und einfacher zu verwendende Metaprogrammierung.
Dies wird in Rails häufig verwendet, vor allem, weil es so einfach zu bedienen ist. Um genau zu sein, können Sie in Ruby beliebigen Code im Kontext der Klasse ausführen. Die folgenden Schnipsel sind äquivalent:
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
In beiden Fällen können Sie dann Folgendes tun:
Bar.new.hello
welches "HALLO" druckt. Dasclass_eval
Methode verwendet auch einen String, sodass es möglich ist, während der Erstellung einer Klasse Methoden im laufenden Betrieb zu erstellen, deren Semantik je nach den übergebenen Parametern unterschiedlich ist.
Es ist in der Tat möglich, diese Art der Metaprogrammierung in Python (und auch in anderen Sprachen) durchzuführen, aber Ruby hat einen Vorsprung, da die Metaprogrammierung kein spezieller Programmierstil ist. Es ergibt sich aus der Tatsache, dass in Ruby alles ein Objekt ist und alle Codezeilen direkt ausgeführt werden. Infolgedessen sind Class
es selbst Objekte, Klassenkörper haben einen self
Hinweis auf die Klasse, und Sie können Methoden für die Klasse aufrufen, während Sie eine erstellen.
Dies ist in hohem Maße verantwortlich für den Grad der Deklarativität, der in Rails möglich ist, und für die Leichtigkeit, mit der wir neue deklarative Funktionen implementieren können, die wie Schlüsselwörter oder neue Blocksprachenfunktionen aussehen.