Ich wollte dies nicht als Antwort posten, aber Xeoncross hat mich darum gebeten.
(Anmerkung: Wenn jemand das Abschriftenproblem im kleinen Codebeispiel beheben könnte, wäre ich dankbar.)
Erik Max Francis schrieb:
"Brandon J. Van Every" schrieb:
Was ist besser an Ruby als Python? Ich bin mir sicher, dass es etwas gibt. Was ist es? Wäre es nicht viel sinnvoller, die Ruby-Leute danach zu fragen, als die Python-Leute?
Könnte oder könnte nicht, je nach den eigenen Zwecken - wenn jemand beispielsweise eine "soziologische Studie" über die Python-Community anstrebt, ist es wahrscheinlich, dass das Stellen von Fragen an diese Community mehr Aufschluss über Informationen gibt als an anderer Stelle :-). Persönlich habe ich gerne die Gelegenheit genutzt, Dave Thomas 'eintägigem Ruby-Tutorial bei OSCON zu folgen. Unterhalb einer dünnen Schicht von Syntaxunterschieden finde ich Ruby und Python erstaunlich ähnlich - wenn ich den minimalen Spannbaum unter fast allen Sprachen berechnen würde, wären Python und Ruby ziemlich sicher die ersten beiden Blätter, die zusammengeführt werden müssten ein Zwischenknoten :-).
Sicher, ich müde zu tun bekommen, in Ruby, der am Ende jeden Block das dumme „Endes“ eingeben ( und nicht nur unindenting) - aber dann ich komme zu vermeiden , dass die gleich dumm eingeben , :
den Python am erfordert
Start von Jeder Block, das ist also fast eine Wäsche :-). Andere Syntaxunterschiede wie @fooversus
self.foooder die höhere Bedeutung von case in Ruby vs Python sind für mich genauso irrelevant.
Andere stützen ihre Programmiersprachenauswahl zweifellos auf solche Themen und führen die heißesten Debatten - aber für mich ist dies nur ein Beispiel für ein in Kraft gesetztes Parkinson-Gesetz (die Höhe der Debatten zu einem Thema ist umgekehrt proportional zu den Themen tatsächliche Bedeutung). Ein Syntaxunterschied, den ich für wichtig halte, und der für Python spricht - aber andere Leute werden zweifellos genau das Gegenteil meinen - ist, wie man eine Funktion aufruft, die keine Parameter akzeptiert. In Python (wie in C) wenden Sie zum Aufrufen einer Funktion immer den "Aufrufoperator" an - abschließende Klammern direkt nach dem aufgerufenen Objekt (in diesen abschließenden Klammern stehen die Argumente, die Sie beim Aufruf übergeben - if Wenn Sie keine Argumente übergeben, sind die Klammern leer. Damit bleibt die bloße Erwähnung eines Objekts, an dem kein Operator beteiligt ist, nur ein Verweis auf das Objekt - in jedem Kontext, ohne Sonderfälle, Ausnahmen, Ad-hoc-Regeln und dergleichen. In Ruby (wie in Pascal) übergeben Sie zum Aufrufen einer Funktion mit WITH-Argumenten die Argumente (normalerweise in Klammern, obwohl dies nicht immer der Fall ist) - ABER wenn die Funktion keine Argumente annimmt, wird sie implizit nur durch Erwähnung der Funktion aufgerufen. Dies mag die Erwartungen vieler Menschen erfüllen (zumindest derjenigen, deren einzige vorherige Erfahrung im Programmieren mit Pascal oder anderen Sprachen mit ähnlichen "impliziten Aufrufen" wie Visual Basic bestand) - aber für mich bedeutet es das Die bloße Erwähnung eines Objekts kann entweder einen Verweis auf das Objekt oder einen Aufruf an das Objekt bedeuten. Abhängig vom Typ des Objekts - und in den Fällen, in denen ich keinen Verweis auf das Objekt erhalten kann, indem ich es nur erwähne, muss ich explizit "gib mir einen Verweis darauf, nenne es NICHT!" verwenden. Operatoren, die sonst nicht benötigt werden. Meines Erachtens wirkt sich dies auf die "Erstklassigkeit" von Funktionen (oder Methoden oder anderen aufrufbaren Objekten) und die Möglichkeit des reibungslosen Austauschs von Objekten aus. Daher ist dieser spezifische Syntaxunterschied für mich ein schwerwiegender schwarzer Fleck gegenüber Ruby - aber ich verstehe, warum andere etwas anderes tun würden, obwohl ich ihnen kaum vehementer widersprechen könnte :-). Unterhalb der Syntax werden einige wichtige Unterschiede in der Elementarsemantik erläutert. Beispielsweise sind Zeichenfolgen in Ruby veränderbare Objekte (wie in C ++). Während in Python sie nicht veränderbar sind (wie in Java, oder ich glaube, C #). Auch hier können Leute, die in erster Linie nach dem urteilen, was sie bereits kennen, denken, dass dies ein Plus für Ruby ist (es sei denn, sie kennen sich mit Java oder C # aus :-). Ich denke, unveränderliche Strings sind eine exzellente Idee (und ich bin nicht überrascht, dass Java, wie ich finde, diese Idee, die bereits in Python war, neu erfunden hat), obwohl es mir nichts ausmacht, auch einen "veränderlichen String-Puffer" -Typ zu haben (und idealerweise eines mit einer besseren Benutzerfreundlichkeit als Javas eigene "String-Puffer"); und ich gebe dieses Urteil nicht wegen Vertrautheit - vor dem Studium von Java, abgesehen von funktionalen Programmiersprachen, wo Leute, die in erster Linie nach dem urteilen, was sie bereits kennen, denken vielleicht, dass dies ein Plus für Ruby ist (es sei denn, sie kennen sich mit Java oder C # aus, natürlich :-). Ich denke, unveränderliche Strings sind eine exzellente Idee (und ich bin nicht überrascht, dass Java, wie ich finde, diese Idee, die bereits in Python war, neu erfunden hat), obwohl es mir nichts ausmacht, auch einen "veränderlichen String-Puffer" -Typ zu haben (und idealerweise eines mit einer besseren Benutzerfreundlichkeit als Javas eigene "String-Puffer"); und ich gebe dieses Urteil nicht wegen Vertrautheit - vor dem Studium von Java, abgesehen von funktionalen Programmiersprachen, wo Leute, die in erster Linie nach dem urteilen, was sie bereits kennen, denken vielleicht, dass dies ein Plus für Ruby ist (es sei denn, sie kennen sich mit Java oder C # aus, natürlich :-). Ich denke, unveränderliche Strings sind eine exzellente Idee (und ich bin nicht überrascht, dass Java, wie ich finde, diese Idee, die bereits in Python war, neu erfunden hat), obwohl es mir nichts ausmacht, auch einen "veränderlichen String-Puffer" -Typ zu haben (und idealerweise eines mit einer besseren Benutzerfreundlichkeit als Javas eigene "String-Puffer"); und ich gebe dieses Urteil nicht wegen Vertrautheit - vor dem Studium von Java, abgesehen von funktionalen Programmiersprachen, wo Ich denke, unveränderliche Strings sind eine hervorragende Idee (und ich bin nicht überrascht, dass Java, wie ich finde, diese Idee, die bereits in Python enthalten war, neu erfunden hat), obwohl es mir nichts ausmacht, auch einen Typ "veränderlicher Stringpuffer" zu haben (und idealerweise eines mit einer besseren Benutzerfreundlichkeit als Javas eigene "String-Puffer"); und ich gebe dieses Urteil nicht wegen Vertrautheit - vor dem Studium von Java, abgesehen von funktionalen Programmiersprachen, wo Ich denke, unveränderliche Strings sind eine hervorragende Idee (und ich bin nicht überrascht, dass Java, wie ich finde, diese Idee, die bereits in Python enthalten war, neu erfunden hat), obwohl es mir nichts ausmacht, auch einen Typ "veränderlicher Stringpuffer" zu haben (und idealerweise eines mit einer besseren Benutzerfreundlichkeit als Javas eigene "String-Puffer"); und ich gebe dieses Urteil nicht wegen Vertrautheit - vor dem Studium von Java, abgesehen von funktionalen Programmiersprachen, woAlle Daten sind unveränderlich, alle Sprachen, die ich kannte, hatten veränderbare Zeichenfolgen - aber als ich die Idee der unveränderlichen Zeichenfolgen zum ersten Mal in Java sah (was ich gut lernte, bevor ich Python lernte), fand ich sie sofort hervorragend, sehr gut geeignet Die Referenzsemantik einer höheren Programmiersprache (im Gegensatz zur Wertesemantik, die am besten zu Sprachen passt, die näher an der Maschine und weiter von Anwendungen wie C entfernt sind) mit Strings als erstklassige, integrierte (und hübsche) entscheidend) Datentyp.
Ruby hat einige Vorteile in der Elementarsemantik - zum Beispiel das Entfernen von Pythons "Listen gegen Tupel", die eine äußerst subtile Unterscheidung darstellen. Aber meistens ist die Partitur (wie ich es halte, mit Einfachheit ein großes Plus und subtile, kluge Unterscheidungen ein bemerkenswertes Minus) gegen Ruby (z. B. mit geschlossenen und halboffenen Intervallen, mit den Notationen a..b und a .. .b [jeder will behaupten, dass es offensichtlich ist, was was ist? -)], ist albern - IMHO, natürlich!). Wiederum werden Leute, die eine Menge ähnlicher, aber subtil unterschiedlicher Dinge im Kern einer Sprache als PLUS und nicht als MINUS betrachten, diese natürlich "andersherum" zählen, als ich sie zähle :-).
Lassen Sie sich durch diese Vergleiche nicht in die Irre führen und denken Sie, dass die beiden Sprachen
sehr gut sindanders wohlgemerkt. Sie sind nicht. Aber wenn ich gefragt werde, ob ich "capelli d'angelo" mit "spaghettini" vergleichen möchte, nachdem ich darauf hingewiesen habe, dass diese beiden Nudelsorten für niemanden unterscheidbar und in jedem Gericht, das Sie zubereiten möchten, austauschbar sind, hätte ich das unweigerlich mikroskopisch untersuchen, wie sich die Längen und Durchmesser unmerklich unterscheiden, wie sich die Enden der Litzen in einem Fall und nicht in dem anderen verjüngen und so weiter - um zu erklären, warum ich persönlich lieber Capelli d hätte 'angelo als Pasta in jeder Art von Brühe, würde aber Spaghettini als Pastasciutta bevorzugen, um mit geeigneten Saucen für so lange dünne Pastaformen (Olivenöl, gehackter Knoblauch, gehackte rote Paprika und fein gemahlene Sardellen, zum Beispiel - aber wenn Sie Knoblauch und Paprika in Scheiben schneiden, anstatt sie zu hacken, sollten Sie statt des dünneren Abklingens von Spaghettini den schärferen Körper von Spaghetti wählen. oder sogar - ich bin ein Ketzer ...! - leichte Minze ...] Blätter - im allerletzten Moment vor dem Servieren). Hoppla, tut mir leid, es zeigt, dass ich ins Ausland reise und seit einiger Zeit keine Pasta mehr habe. Aber die Analogie ist immer noch ziemlich gut! -) und wäre gut beraten, auf die Achoview zu verzichten und stattdessen etwas frisches Frühlingsbasilikum hinzuzufügen [oder sogar - ich bin ein Ketzer ...! - leichte Minze ...] Blätter - im allerletzten Moment vor dem Servieren). Hoppla, tut mir leid, es zeigt, dass ich ins Ausland reise und seit einiger Zeit keine Pasta mehr habe. Aber die Analogie ist immer noch ziemlich gut! -) und wäre gut beraten, auf die Achoview zu verzichten und stattdessen etwas frisches Frühlingsbasilikum hinzuzufügen [oder sogar - ich bin ein Ketzer ...! - leichte Minze ...] Blätter - im allerletzten Moment vor dem Servieren). Hoppla, tut mir leid, es zeigt, dass ich ins Ausland reise und seit einiger Zeit keine Pasta mehr habe. Aber die Analogie ist immer noch ziemlich gut! -)
Also, zurück zu Python und Ruby, kommen wir zu den zwei großen Dingen (in Bezug auf die eigentliche Sprache - das Verlassen der Bibliotheken und anderer wichtiger Hilfsmittel wie Tools und Umgebungen, das Einbetten / Erweitern jeder Sprache usw. usw.) es fürs Erste - sie würden sowieso nicht für alle IMPLEMENTIERUNGEN jeder Sprache gelten, zB Jython vs Classic Python sind zwei Implementierungen der Python-Sprache!):
Rubys Iteratoren und Codeblöcke im Vergleich zu Pythons Iteratoren und Generatoren;
Rubys GESAMT, ungezügelte "Dynamik", einschließlich der Fähigkeit, jede vorhandene Klasse, einschließlich aller eingebauten, "wieder zu öffnen" und ihr Verhalten zur Laufzeit zu ändern - im Gegensatz zu Pythons gewaltiger, aber begrenzter
Dynamik, die das Verhalten der vorhandenen nie ändert eingebaute Klassen und ihre Instanzen.
Persönlich halte ich 1 für eine Wäsche (die Unterschiede sind so tief, dass ich leicht sehen konnte, wie die Leute beide Ansätze hassen und den anderen verehren, aber auf MEINER persönlichen Skala gleichen sich die Vor- und Nachteile fast aus); und [2] ein entscheidendes Problem - eines, das Ruby viel besser zum "Basteln" geeignet macht, ABER Python eignet sich auch besser für den Einsatz in großen Produktionsanwendungen. In gewisser Weise ist es lustig, weil beide Sprachen so VIEL dynamischer sind als die meisten anderen, dass am Ende der entscheidende Unterschied zwischen ihnen und meinem POV davon abhängen sollte - dass Ruby in dieser Hinsicht "auf elf geht" (die Referenz) hier geht es natürlich um "Spinal Tap"). In RubyDAS KANN ICH TUN ! Das heißt, ich kann die eingebaute Zeichenfolgenklasse dynamisch ändern
a = "Hallo Welt"
b = "Hallo Welt"
wenn a == b
print "gleich! \ n"
sonst
"anders! \ n" drucken
Ende
WIRD "gleich" drucken. In Python gibt es KEINE Möglichkeit, das zu tun. Für die Zwecke der Metaprogrammierung, der Implementierung experimenteller Frameworks und dergleichen ist diese erstaunliche dynamische Fähigkeit von Ruby extrem
reizvoll. ABER - wenn es um große Anwendungen geht, die von vielen Leuten entwickelt und von noch mehr gepflegt werden, einschließlich aller Arten von Bibliotheken aus verschiedenen Quellen, und die auf Client-Sites in Produktion gehen müssen ... nun, ich WILL nicht Eine Sprache, die so dynamisch ist, vielen Dank. Ich verabscheue die Idee, dass eine Bibliothek andere, nicht miteinander in Beziehung stehende Bibliotheken, die sich darauf verlassen, dass diese Zeichenfolgen unterschiedlich sind, unwissentlich aufbricht - das ist die Art von tief und tief verborgenem "Kanal" zwischen Codeteilen, die LOOK und SHOULD BE separate sind, die den Tod bedeuten umfangreiche Programmierung. Indem Sie ein Modul das Verhalten eines anderen "verdeckt" beeinflussen lassen,
Wenn ich Ruby für eine so große Anwendung verwenden müsste, würde ich versuchen, mich auf Einschränkungen des Codierungsstils, viele Tests (die immer dann wiederholt werden, wenn sich ALLES ändert - auch wenn etwas völlig unabhängig sein sollte ...) und dergleichen zu verlassen. um die Verwendung dieser Sprachfunktion zu verbieten. Aber es ist meiner Meinung nach noch besser, das Feature überhaupt nicht zu haben - genau wie Python selbst eine noch bessere Sprache für die Anwendungsprogrammierung wäre, wenn eine bestimmte Anzahl von eingebauten Funktionen "festgenagelt" werden könnte, also WUSSTE ich, dass ZB
len("ciao")ist 4 (anstatt sich unterschwellig darum kümmern zu müssen, ob jemand die Namensbindung lenim __builtins__
Modul geändert hat ...). Ich hoffe, dass Python irgendwann seine eingebauten Funktionen "festnagelt".
Das Problem ist jedoch geringfügig, da das Neueinbinden von eingebauten Funktionen in Python eine ziemlich veraltete und auch seltene Praxis ist. In Ruby erscheint es mir als sehr wichtig - genau wie die zu mächtigen
Makrofunktionen anderer Sprachen (wie zum Beispiel Dylan) meiner Meinung nach ähnliche Risiken bergen (ich hoffe, dass Python niemals ein so mächtiges Makrosystem bekommt, nein Ganz gleich, wie verlockend es ist, "die Leute ihre eigenen domänenspezifischen kleinen Sprachen definieren zu lassen, die in der Sprache selbst eingebettet sind" - dies würde meiner Meinung nach Pythons wundervollen Nutzen für die Anwendungsprogrammierung beeinträchtigen, indem dem potenziellen Bastler, der dies tut, ein "attraktives Ärgernis" geboten wird lauert im Herzen eines jeden Programmierers ...).
Alex