Prawdopodobnie istnieją dwie główne różnice:
Ruby ma eleganckie, anonimowe zamknięcia.
Railsy wykorzystują je z dobrym skutkiem. Oto przykład:
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
Anonimowe domknięcia / lambdy ułatwiają emulowanie nowych funkcji językowych, które wymagałyby blokowania. W Pythonie zamknięcia istnieją, ale muszą zostać nazwane, aby mogły być używane. Więc zamiast być w stanie używać domknięć do emulacji nowych funkcji języka, jesteś zmuszony do wyrażenia wprost faktu, że używasz domknięcia.
Ruby ma czystsze i łatwiejsze w użyciu metaprogramowanie.
Jest to często używane w Railsach, głównie ze względu na łatwość użycia. Mówiąc konkretnie, w Rubim możesz wykonać dowolny kod w kontekście klasy. Następujące fragmenty są równoważne:
class Foo
def self.make_hello_method
class_eval do
def hello
puts "HELLO"
end
end
end
end
class Bar < Foo
make_hello_method
end
class Bar < Foo; end
Bar.make_hello_method
W obu przypadkach możesz wtedy:
Bar.new.hello
co spowoduje wydrukowanie „HELLO”. class_eval
Metoda bierze również ciągiem znaków, więc jest to możliwe, aby utworzyć metody w locie, jak klasa jest tworzona, które mają różne semantykę w oparciu o parametry, które są przekazywane w.
W rzeczywistości jest możliwe wykonanie tego rodzaju metaprogramowania w Pythonie (i innych językach), ale Ruby ma przewagę, ponieważ metaprogramowanie nie jest specjalnym stylem programowania. Wynika to z faktu, że w Rubim wszystko jest obiektem i wszystkie linie kodu są bezpośrednio wykonywane. W rezultacie Class
es są same w sobie obiektami, treści klas mają self
wskazanie na klasę i możesz wywoływać metody z klasy podczas jej tworzenia.
Jest to w dużej mierze odpowiedzialne za stopień deklaratywności możliwej w Railsach i łatwość, z jaką jesteśmy w stanie zaimplementować nowe deklaratywne funkcje, które wyglądają jak słowa kluczowe lub nowe funkcje języka blokowego.