Warum ist Ruby für Rails besser geeignet als Python? [geschlossen]

90

Python und Ruby gelten normalerweise als enge Cousins ​​(wenn auch mit ganz unterschiedlichem historischem Gepäck) mit ähnlicher Ausdruckskraft und Kraft. Einige haben jedoch argumentiert, dass der immense Erfolg des Rails-Frameworks wirklich viel mit der Sprache zu tun hat, auf der es basiert: Ruby selbst. Warum sollte Ruby für ein solches Framework besser geeignet sein als Python?

Victor Yan
quelle
44
Alliteration. _
Jimmy
75
"Python on Pails" hat einfach nicht das gleiche Gefühl ...
kurzlebig
105
@ Ephemient: Ich glaube, es wäre Python on Planes.
Jimmy
37
@ Jimmy: Wer braucht Flugzeuge? Import Antigravitation ;-) xkcd.com/353
Vinay Sajip
157
Gibt es ein Java in Gefängnissen?
Nosredna

Antworten:

170

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 Classes selbst Objekte, Klassenkörper haben einen selfHinweis 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.

Yehuda Katz
quelle
40
In Python sind alles Objekte und alle Codezeilen werden auch direkt ausgeführt. ;) Aber du hast kein "Selbst", das auf die Klasse im Klassenkörper zeigt, das erst nach der Klassendefinition erstellt wird, also musst du diesen Code danach in Python einfügen, was zugegebenermaßen weniger elegant ist , aber funktional gleichwertig.
Lennart Regebro
31
@ Lennart das ist der Punkt. Mit Python können Sie die gleichen Dinge mit benannten Lambdas, Dekorateuren und dem Einfügen von Code tun, nachdem Klassen erstellt wurden. Der Verlust an Eleganz summiert sich jedoch schnell und macht so etwas wie Rails für Endbenutzer entweder merklich schwieriger zu implementieren oder merklich weniger elegant.
Yehuda Katz
9
Sie sehen für mich nicht wirklich nach großen Unterschieden aus.
Dietrich Epp
10
@ Lennart Ich bin ein bisschen verwirrt. Ich sagte, dass Sie sie in Python nicht brauchten - aber dass sie den Code nicht implementierten oder für Endbenutzer (den einen oder anderen) weniger elegant machten, wenn sie nicht vorhanden waren. Die Sprachen sind vollständig - Sie können Rails in C schreiben, wenn Sie möchten.
Yehuda Katz
5
@lennart Jetzt betreten wir subjektives Gebiet, aber die beiden Funktionen, über die ich gesprochen habe, sind sehr praktisch, wenn Frameworks mit einer Mischung aus deklarativer und prozeduraler Programmierung erstellt werden. Insbesondere das Fehlen anonymer Lambdas ist eine Einschränkung der Ausdruckskraft von Python. Der Mangel an Konsistenz (die Notwendigkeit, mit erstellten Klassen nur zu arbeiten, nachdem Klassen erstellt wurden) ist ebenfalls sehr einschränkend.
Yehuda Katz
58

Diejenigen, die das argumentiert haben

Der immense Erfolg des Rails-Frameworks hat wirklich viel mit der Sprache zu tun, auf der es basiert

sind (IMO) falsch. Dieser Erfolg ist wahrscheinlich mehr auf kluges und nachhaltiges Marketing zurückzuführen als auf technische Fähigkeiten. Django macht in vielen Bereichen (z. B. dem eingebauten Kick-Ass-Administrator) wohl einen besseren Job, ohne dass Ruby-Funktionen erforderlich sind. Ich disse Ruby überhaupt nicht, stehe nur für Python ein!

Vinay Sajip
quelle
10
Nun, wir betreten hier subjektives Gebiet. Wenn Sie der Meinung sind, dass der Administrator ein "Einziger" ist, liegt dies möglicherweise daran, dass Sie die zeitsparenden Vorteile, die er bietet, nicht genossen haben. Gibt es Bereiche, in denen Django Ihrer Meinung nach schlechter abschneidet als Rails, weil Ruby Funktionen hat und Python nicht? Es geht wirklich nicht darum, welches Framework besser ist - es geht darum, ob (wie an anderer Stelle in dieser Frage ausgeführt) in Python etwas fehlt, was es weniger in der Lage macht, ein Kick-Ass-Framework zu entwickeln. An den Beweisen gibt es keinen solchen Mangel.
Vinay Sajip
18
@ An die Downvoters: Es macht mir nichts aus, aber ich bin gespannt, warum Sie dachten, meine Antwort sei nicht hilfreich . Ich habe nicht bemerkt, dass einer herabgestimmt hat, weil einer mit der Position von jemandem nicht einverstanden war - ich habe im Allgemeinen nur dort herabgestimmt, wo ich das Gefühl hatte, dass eine Frage oder Antwort die Dinge irgendwie verschlimmert.
Vinay Sajip
5
Ich kann meinen eigenen Admin-Bereich schreiben, ich brauche das nicht im Framework. Ich bevorzuge andere Möglichkeiten, um das Schreiben meiner Bewerbung zu vereinfachen.
Nitecoder
8
@railsninja: Gut für dich. Ich bevorzuge es, keine Boilerplate-Seiten für die Verwaltungsaufgaben des Administrators schreiben zu müssen, die die meisten Systeme benötigen. Vor kurzem habe ich einige Pro-Bono-Arbeiten für eine lokale Wohltätigkeitswebsite durchgeführt, und es wäre nicht möglich gewesen, diese Website überhaupt zu erstellen, wenn der Django-Administrator nicht Teil der Gleichung gewesen wäre. So wie es war, habe ich eine Site mit einer ziemlich angepassten Ajaxified-Benutzeroberfläche für die Endbenutzer bereitgestellt, aber Back-End-Administratoren haben mit dem Administrator zusammengearbeitet und es war mehr als ausreichend für ihre Anforderungen.
Vinay Sajip
6
@Matt: Seine Frage ist, warum Ruby besser geeignet ist als Python. Und die Antwort ist ganz richtig, dass es nicht so ist.
Lennart Regebro
54

Die Python-Community glaubt, dass es die höchste Form von Eleganz ist, Dinge so einfach und unkompliziert wie möglich zu machen. Die Ruby-Community glaubt, dass es die höchste Form von Eleganz ist, Dinge auf clevere Weise zu tun, die coolen Code ermöglichen.

Bei Rails dreht sich alles um die Einhaltung bestimmter Konventionen. Viele andere Dinge passieren auf magische Weise für Sie. Das passt sehr gut zu der rubinroten Sichtweise auf die Welt, folgt aber nicht wirklich der Python-Art.

Matt Briggs
quelle
4
Sicher, aber es gibt einen Verlust von Perl-Leuten (na ja , vielleicht nicht viele ), die kryptische Einzeiler für cool halten, und viele Lisp-Leute, die schwören, dass es die einzig wahre Sprache ist. Wir befinden uns definitiv auf dem Gebiet, auf dem Ihr Boot schwimmt.
Vinay Sajip
4
Rails hat keine Magie, es ist genau dort in der Quelle. Wenn du wissen willst wie, geh runter von deinem Arsch und finde es heraus.
Nitecoder
21
"Jede ausreichend fortschrittliche Technologie ist von Magie nicht zu unterscheiden." - Arthur C. Clarke
Vinay Sajip
1
"Magie" bedeutet, dass das Framework eine Menge Dinge für Sie erledigt, ohne direkt gefragt zu werden. Auch hier mache ich keine Werturteile, es ist eine Art, Dinge zu tun, die gute und schlechte Seiten hat. Persönlich denke ich, dass es wunderbar in Schienen funktioniert.
Matt Briggs
2
Eleganz und Konventionen bedeuten keine Magie.
BJ Clark
26

Ist diese Debatte eine neue Debatte "vim versus emacs"?

Ich bin ein Python / Django-Programmierer und habe bisher noch nie ein Problem in dieser Sprache / diesem Framework gefunden, das mich dazu veranlassen würde, zu Ruby / Rails zu wechseln.

Ich kann mir vorstellen, dass es dasselbe wäre, wenn ich Erfahrung mit Ruby / Rails hätte.

Beide haben eine ähnliche Philosophie und erledigen ihre Arbeit schnell und elegant. Die bessere Wahl ist das, was Sie bereits wissen.

luc
quelle
25

Persönlich finde ich, dass Ruby Python in vielerlei Hinsicht überlegen ist, was ich als "konsequente Ausdruckskraft" bezeichnen würde. In Ruby ist join beispielsweise eine Methode für das Array-Objekt, die eine Zeichenfolge ausgibt, sodass Sie Folgendes erhalten:

numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=> "1,2,3,4"

In Python ist join eine Methode für das String-Objekt, die jedoch einen Fehler auslöst, wenn Sie etwas anderes als einen String als zu verbindendes Objekt übergeben. Das gleiche Konstrukt ist also ungefähr so:

numlist = [1,2,3,4]
numlist
#=> [1, 2, 3, 4]
",".join([str(i) for i in numlist])
#=> '1,2,3,4'

Es gibt viele dieser kleinen Unterschiede, die sich im Laufe der Zeit summieren.

Ich kann mir auch keinen besseren Weg vorstellen, um unsichtbare Logikfehler einzuführen, als Leerzeichen signifikant zu machen.

Felder
quelle
29
Ich habe die Erfahrung gemacht, dass das Beheben von Leerzeichen dazu beiträgt, dass Logikfehler verschwinden. Es ist viel verwirrender, wenn Abstand und Syntax nicht übereinstimmen.
Nosredna
5
In Sprachen mit Anfang und Ende und in Sprachen mit geschweiften Klammern und in Assembly habe ich gesehen, dass Code falsch eingefügt wurde und später Probleme verursacht. Das ist immer ein Problem. Haben Sie große Probleme damit gehabt, dass Leute Python schlecht eingefügt haben?
Nosredna
5
Leerzeichen sind in Python nicht von Bedeutung: secnetix.de/~olli/Python/block_indentation.hawk . Es ist fast unmöglich, "unsichtbare Fehler" aufgrund von Einrückungen in Python einzuführen (Sie müssen Ihre Editoreinstellungen verfälschen), während es natürlich durchaus möglich ist, unsichtbare Fehler aufgrund von Einrückungen in einer anderen Sprache einzuführen, indem Sie einfach falsch einrücken. @fields: Kopieren Sie also keinen Code über Skype oder HTML. Meine Güte.
Lennart Regebro
7
Es ist richtig, dass Python sich beschwert, wenn Sie versuchen, Zeichenfolgen Nicht-Strings hinzuzufügen, wie in einem Join. Dies liegt daran, dass explizit besser als implizit ist. Es gibt nur sehr wenige automatische Konvertierungen in Python, und der Grund dafür ist, dass sie zu Problemen führen, insbesondere in dynamischen Sprachen, da die Dinge nicht dem Typ entsprechen, den Sie erwartet haben. Sicher, die Methode "" .join () fühlt sich am Anfang rückwärts an, aber das ist der Grund. Auf der Liste macht es eigentlich keinen Sinn ...
Lennart Regebro
8
Gott, der Allmächtige ... Du meinst statisch getippt, nicht stark getippt. Python ist stark typisiert, ebenso Ruby: stackoverflow.com/questions/520228/… Sie können einer Ganzzahl in Ruby auch keine Zeichenfolge hinzufügen. Ich habe es satt, Sie zu korrigieren. Bitte überprüfen Sie Ihre Fakten, bevor Sie in Zukunft antworten.
Lennart Regebro
15

Die wirkliche Antwort ist weder Python noch Ruby sind bessere / schlechtere Kandidaten für ein Webframework. Wenn Sie Objektivität wünschen, müssen Sie Code in beide schreiben und herausfinden, welcher Ihrer persönlichen Vorlieben am besten entspricht, einschließlich der Community.

Die meisten Menschen, die für die eine oder andere argumentieren, haben die andere Sprache entweder nie ernsthaft benutzt oder stimmen für ihre persönlichen Vorlieben.

Ich würde vermuten, dass sich die meisten Leute darauf festlegen, mit wem sie zuerst in Kontakt kommen, weil es ihnen etwas Neues beibringt (MVC, Tests, Generatoren usw.) oder etwas Besseres tut (Plugins, Vorlagen usw.). Ich habe mit PHP entwickelt und bin mit RubyOnRails in Kontakt gekommen. Wenn ich vor der Suche nach Rails von MVC gewusst hätte, würde ich PHP höchstwahrscheinlich nie zurücklassen. Aber als ich anfing, Ruby zu verwenden, hat mir die Syntax, die Funktionen usw. gefallen.

Wenn ich zuerst Python und eines seiner MVC-Frameworks gefunden hätte, würde ich diese Sprache höchstwahrscheinlich stattdessen loben!

Kris
quelle
11

Python hat eine ganze Reihe von Rails-ähnlichen Frameworks. Es gibt so viele, dass ein Witz geht, dass während des typischen Gesprächs auf PyCon mindestens ein Webframework das Licht der Welt erblicken wird.

Das Argument, dass Rubys Meta-Programmierung es besser geeignet machen würde, ist IMO falsch. Für solche Frameworks benötigen Sie keine Metaprogrammierung.

Ich denke, wir können daraus schließen, dass Ruby in dieser Hinsicht nicht besser (und wahrscheinlich auch nicht schlechter) als Python ist.

Lennart Regebro
quelle
8

Weil Rails entwickelt wurde, um die Funktionen von Rubys zu nutzen.

Eine ähnlich gormlose Frage wäre: "Warum ist Python für Django besser geeignet als Ruby?".

Paddy3118
quelle
4

Ich nehme an, wir sollten nicht die Sprachmerkmale an sich diskutieren , sondern die Akzente, die die jeweiligen Gemeinschaften auf den Sprachmerkmalen setzen. In Python ist das erneute Öffnen einer Klasse beispielsweise durchaus möglich, jedoch nicht üblich. In Ruby gehört es jedoch zur täglichen Praxis, eine Klasse wieder zu eröffnen. Dies ermöglicht eine schnelle und unkomplizierte Anpassung des Frameworks an die aktuellen Anforderungen und macht Ruby für Rails-ähnliche Frameworks günstiger als jede andere dynamische Sprache. Daher meine Antwort: gemeinsame Verwendung von Wiedereröffnungsklassen.

Giorgi
quelle
1

Einige haben gesagt, dass die Art der Metaprogrammierung, die erforderlich ist, um ActiveRecord (eine Schlüsselkomponente von Schienen) zu ermöglichen, in Ruby einfacher und natürlicher ist als in Python - ich kenne Python noch nicht;), daher kann ich diese Aussage nicht persönlich bestätigen.

Ich habe kurz Rails verwendet, und die Verwendung von Catchalls / Interceptors und dynamischer Auswertung / Code-Injection ermöglicht es Ihnen, auf einer viel höheren Abstraktionsebene zu arbeiten als einige der anderen Frameworks (vor ihrer Zeit). Ich habe wenig bis gar keine Erfahrung mit Pythons Framework - aber ich habe gehört, dass es gleichermaßen fähig ist - und dass die Python-Community großartige Arbeit leistet, um pythonische Bemühungen zu unterstützen und zu fördern.

Faisal Vali
quelle
3
In der Tat wird diese Art von "Magie" in Python oft verpönt; Zum Beispiel code.djangoproject.com/wiki/RemovingTheMagic
Ephemient
2
Ich denke, "Magie" (Metaprogrammier-Tricks) für "Magie" sollte immer verpönt sein - einfacherer Code, aber ebenso mächtig und ausdrucksstark, sollte immer gewinnen -, aber es gibt Fälle, in denen die einzige Möglichkeit besteht, die genaue Funktionalität und Syntax bereitzustellen du willst "Magie" - und in diesen Fällen ist die "Magie" unverzichtbar;)
Faisal Vali
1

Ich denke, dass die Syntax sauberer ist und Ruby zumindest für mich viel "angenehmer" ist - so subjektiv das auch ist!

James Schorr
quelle
-1

Zwei Antworten:

ein. Weil Schienen für Rubin geschrieben wurden.

b. Aus dem gleichen Grund ist C besser für Linux geeignet als Ruby

Dhananjay Nene
quelle
Angesichts des Kontextes der Frage macht die Antwort absolut keinen Sinn.
Lorefnon
-6

All dies ist VOLLSTÄNDIG "IMHO"

In Ruby gibt es EIN Webanwendungsframework, daher ist es das einzige Framework, das für diese Sprache beworben wird.

Python hatte seit seiner Gründung mehrere, um nur einige zu nennen: Zope, Twisted, Django, TurboGears (es ist selbst eine Mischung aus anderen Framework-Komponenten), Pylons (eine Art Klon des Rails-Frameworks) und so weiter. Keiner von ihnen wird in der gesamten Python-Community als "THE one to use" unterstützt, sodass die gesamte "Groundswell" auf mehrere Projekte verteilt ist.

Rails hat allein oder zumindest in der überwiegenden Mehrheit aufgrund von Rails die Community-Größe.

Sowohl Python als auch Ruby sind perfekt in der Lage, die Arbeit als Webanwendungsframework zu erledigen. Verwenden Sie die, die SIE (und Ihr potenzielles Entwicklungsteam) mögen und auf die Sie sich ausrichten können.

Ch'marr
quelle
7
Ruby hat mehrere Webanwendungs-Frameworks: Nitro, Merb, Camping ... um nur einige zu nennen
Corban Brook
5
Hinzufügen: Sinatra und sogar eine nackte Rack-App für sehr schnelle, sehr minimale Web-Apps.
Kris
2
-1 "In Ruby gibt es EIN Webanwendungs-Framework" zu kategorisch ... für eine falsche Aussage. Nitro, Merb, Camping, Sinatra
Maximiliano Guzman
2
Uninformierte Meinungen von beiden Seiten sind genau die Ursache für Verwirrung bei Neuankömmlingen, die versuchen, all dies zu klären. Es bedeutet auch, dass man etwas verpassen könnte, das man wirklich schätzen würde, wenn man es besser wüsste.
Walt Jones
3
Ich denke, sein Punkt war, dass Rails eine große Meinung über die Ruby-Community hat als Django über die Python-Community, was gültig ist
pjb3