Leute, die Sinatra oder OctoPress verwenden. Unabhängig davon finde ich aber schon beeindruckend, was manche Leute mit Rails umsetzen, schaut man sich GitHub oder Discourse an.
Also Bash und Perl kann ich ja verstehen, aber was genau unterscheidet Ruby jetzt von Python derart, dass Du es auf eine "höhere" Stufe rückst? *wunder*
Python und Ruby sind von der Ausdrucksstärke auf einem Level - die Bash sicher nicht. Gegen Perl spricht einfach das übliche Perl Gebashe
Insofern war meine Frage kein Flameanstoß, sondern durchaus ernst gemeint. Ich sehe hier nämlich keinen Unterschied, der so eine Abstufung rechtfertigte.
Von heidideldei am Di, 26. Februar 2013 um 01:32 #
Z. B. gibt es in Ruby nicht die sinnfreie Unterscheidung zwischen Statements und Expressions. Das führt dann in Python zu solchen Beschränkungen wie dass man keine Schleife in einem Lambda verwenden kann, weil ein Lambda immer nur einen Ausdruck enthalten kann. Ich persönlich finde auch die Sigils ganz nett, @x ist einfach kürzer als self.x und genauso klar, wenn man diese Syntax gewöhnt ist.
"@x ist einfach kürzer als self.x und genauso klar, wenn man diese Syntax gewöhnt ist."
Aber genau das ist das Problem: Die Python-Syntax ist so gewählt, das man vieles gar nicht erst erlernen muss, man soll den Code möglichst leicht und ohne Vorwissen verstehen. Natürlich ist immer etwas Vorwissen nötig, aber für jemanden mit ein wenig OOP Erfahrung dürfte self.x selbsterklärend sein, @x ist es aber nicht.
Es gibt durchaus Aspekte an Ruby die ich mag, wie z.B. Blöcke. Aber dann gibt es sehr viele Punkte in denen ich Python bevorzuge:
Syntax
Auf den ersten Blick mögen so Dinge wie suffix-ifs eine nette Idee sein, ich hab aber schon öfters Code gesehen, bei dem irgendwann am Ende eines langen Blocks plötzlich so ein if steht, und somit mein mentales Modell des gerade gelesenen Codes zerstört. Ist doch alles anders. Und unless ist auch so eine Sache. Vor allem komplexere Bedingungen lesen sich leichter als if. Zuweisungen in Ausdrücke sind auch böse. Die Ambiguität zwischen Blöcken und Hash-Literalen in manchen Fällen nervt auch.
Leaking Functions
In Ruby ist das return Keyword optional. Der letzte Wert wird immer zurückgegeben. Wenn die Funktion nichts zurückgeben soll (also streng genommen eine Prozedur ist), muss man explizit nil am Ende schreiben. Nah das wird wer machen. Also hat man nun unzählige Funktionen, die Sachen zurück geben, bei denen man sich nicht sicher sein kann ob das nur ein unabsichtlicher Seiteneffekt ist. Da muss man hoffen, dass die Funktion ausreichend dokumentiert wurde.
Shell Injections/Subprocesses
In Ruby 1.8 gibt es keinen Weg Injection-sicher Subprozesse aufzurufen und gleichzeitig den Ouput zu fangen. Die ` ` Syntax ist einfach nur Horror, weil es da natürlich alle Parameter zerlegt und in 1.8 kann man IO.popen nur einen String, kein Array, übergeben. Man müsste also Parameter selber escapen. Nur ist das OS (bzw. Shell) abhängig.
$-Variablen
Manche Dinge setzen kryptische $-Variablen als Seiteneffekte. Manchmal sogar als Globale Variablen (z.B. system und ` `)! Glaobal state. OMG.
Truth
Der Numerische Wert 0 ist in Ruby true. Zumal das in allen anderen (gängigen/mir bekannten) Sprachen in denen ein Numerischer Wert als Wahrheitswert verwendet werden könne false ergibt, ist das mal wieder eine super Bug Quelle. Ich hätte nichts dagegen, dass wenn man einen nicht-boolschen Wert in einer Bedingung verwendet man eine Exception bekommt. Das währe nur konsequent und würde solche Fehler verhindern. Aber so geht das gar nicht.
Es gibt keinen Bool(ean) Typen
Man muss echt überprüfen, ob eine Variable den Typen TrueClass oder FalseClass besitzt. Wessen geniale Idee war das den bitte? In der Typsysteme Vorlesung gepennt?
Redundante Methodennamen
Was soll das? Warum gibt es z.B. size und length? Was ist der Unterschied? Keiner? Warum gibts das dann? Und manchmal (z.B. ActiveRecord) gibt es auch ein count das ohne Parameter auch das selbe macht (naja, so ca.). Das führt zu super einheitlichen Code.
Mutable Strings
Wessen Idee war das schon wieder? In einer OO garbage collecteden Sprache kann man Strings doch nicht mutable machen! Wenn ich irgendeinem Objekt in einen Setter einen String übergebe erwarte ich das der Wert so bleibt wie er ist, aber bei mutable Strings kann der zu jeder Zeit unabhängig geändert werden. Es gibt kein const in solchen Sprachen! Genauso sollte man Listen nicht als Hash Keys verwenden dürfen. Für sowas sollte es Tupel geben.
Nix vergleichbares zu urllib2
Pythons urllib(2) ist ziemlich nett zu verwenden und sehr einfach zu erweitern. Hab z.B. mit ein paar Zeilen data:-URL Support hinzugefügt. Eine vergleichbare API gibt es für Ruby zumindest nicht in der stdlib.
Builtin Methodennamen
Ich mag Python's __*__ Namenskonvention für builtin Methodennamen. Wenn ich dann mit dir(obj) mir die Attribute und Methoden anzeigen lasse sind die __*__ Methoden an den Anfang sortiert und ich kann sie einfach ignorieren. Mit so Methodennamen wie "instance_variable_get" geht das nicht.
Ruby hat ein paar gute Ansätze, wurde aber mit extrem viel Müll verunstaltet, der offensichtlich von Leuten erdacht wurde, die keine Vorlesung zu Programmiersprachen/Typsysteme besucht haben.
Nutze es als Allzwecksprache. PHP ist seit Ruby (on Rails) für mich gestorben. Python war aufgrund der Syntax nie eine Option für mich und Perl habe ich zur Seite gelegt als ich mir die Objektorientierung von Perl angeschaut habe. Ich verwende Ruby auch an Stellen wo man eher Shellscripting verwenden würde, da mir Shell in vielerlei Hinsicht auch nicht gefällt. Die Frage sollte eher lauten: Wer nutzt Ruby bitte nicht?
> Die Frage sollte eher lauten: Wer nutzt Ruby bitte nicht?
Gute Frage -- mach doch mal ne Umfrage. Ich vermute, unter den folgenden Programmieren haben die meisten noch nie etwas praktisches mit Ruby gemacht:
- Java Programmierer - Webprogrammierer, die sich an PHP gewöhnt haben, weil das so weit verbreitet ist und für alles irgendwie funktioniert - Leute, die Desktopsoftware in Python schreiben - C/C++ Leute
Kurz: alle, die etwas anderes gelernt haben, das für sie funktioniert und die keine Zeit/Lust oder keinen Bedarf haben, etwas anderes zu lernen. Dass etwas gut ist und gut funktioniert bedeutet nicht, dass es auch von vielen benutzt wird.
Dieser Beitrag wurde 2 mal editiert. Zuletzt am 26. Feb 2013 um 14:54.
Leute die eine Programmiersprache für sich sterben lassen können, haben noch nichts sinnvolles programmiert! Auch wenn ich von Java weg wollte, was mache ich mit meinen, zum Teil mehr als 10 Jahre alten, Kundenprojekten? Neu schreiben? Das zahlt kein Mensch!
Natürlich probiert man bei kleineren Geschichten mal was Neues. Aber so revolutionär sind Python,Ruby und Konsorten auch wieder nicht.
Und ob man drei Zeichen bei einem Statement mehr oder weiniger eingeben muss, ist doch Bullshit. Man schreibt doch sowieso nichts aus. Das macht der Editor.
Bei ruby sind es vor allem die Konstruke die Möglich sind die es bei PHP nicht gibt. Außerdem ist die Möglichkeit Ruby zu erweitern dank Gems extrem einfach.
Kann sein dass es sowas auch in Perl oder Python gibt, in PHP meines Wissens aber noch nicht: 3.times { puts "Hello" } nicht sonderlich sinnvoll, aber teilweise braucht man solche Konstrukte eben doch und sind dann doch einfacher und leserlicherlicher als eine for-Schleife.
Ruby ist sicherlich nicht perfekt und auch nicht für jedermann, aber ich denke die Aufgaben für die es verwendet wird, erfüllt es schon sehr gut und ich habe bisher keinen getroffen der mit Ruby gearbeitet hat und pauschal sagte, dass es er/sie es schlecht findet.
schau in den betreff
Leute, die Sinatra oder OctoPress verwenden.
Unabhängig davon finde ich aber schon beeindruckend, was manche Leute mit Rails umsetzen, schaut man sich GitHub oder Discourse an.
Ach ja: Leute, die mruby in ihre Anwendungen einbetten. Z.B. das Spiel Eversion macht davon Gebrauch.
Ich benutz das als Allzeweckskriptsprache. Bash, Perl oder Python tu ich mir nicht mehr an.
Also Bash und Perl kann ich ja verstehen, aber was genau unterscheidet Ruby jetzt von Python derart, dass Du es auf eine "höhere" Stufe rückst? *wunder*
Python und Ruby sind von der Ausdrucksstärke auf einem Level - die Bash sicher nicht. Gegen Perl spricht einfach das übliche Perl Gebashe
Insofern war meine Frage kein Flameanstoß, sondern durchaus ernst gemeint. Ich sehe hier nämlich keinen Unterschied, der so eine Abstufung rechtfertigte.
Z. B. gibt es in Ruby nicht die sinnfreie Unterscheidung zwischen Statements und Expressions. Das führt dann in Python zu solchen Beschränkungen wie dass man keine Schleife in einem Lambda verwenden kann, weil ein Lambda immer nur einen Ausdruck enthalten kann. Ich persönlich finde auch die Sigils ganz nett, @x ist einfach kürzer als self.x und genauso klar, wenn man diese Syntax gewöhnt ist.
"@x ist einfach kürzer als self.x und genauso klar, wenn man diese Syntax gewöhnt ist."
Aber genau das ist das Problem: Die Python-Syntax ist so gewählt, das man vieles gar nicht erst erlernen muss, man soll den Code möglichst leicht und ohne Vorwissen verstehen.
Natürlich ist immer etwas Vorwissen nötig, aber für jemanden mit ein wenig OOP Erfahrung dürfte self.x selbsterklärend sein, @x ist es aber nicht.
Es gibt durchaus Aspekte an Ruby die ich mag, wie z.B. Blöcke. Aber dann gibt es sehr viele Punkte in denen ich Python bevorzuge:
Syntax
Auf den ersten Blick mögen so Dinge wie suffix-ifs eine nette Idee sein, ich hab aber schon öfters Code gesehen, bei dem irgendwann am Ende eines langen Blocks plötzlich so ein if steht, und somit mein mentales Modell des gerade gelesenen Codes zerstört. Ist doch alles anders. Und unless ist auch so eine Sache. Vor allem komplexere Bedingungen lesen sich leichter als if. Zuweisungen in Ausdrücke sind auch böse. Die Ambiguität zwischen Blöcken und Hash-Literalen in manchen Fällen nervt auch.
Leaking Functions
In Ruby ist das return Keyword optional. Der letzte Wert wird immer zurückgegeben. Wenn die Funktion nichts zurückgeben soll (also streng genommen eine Prozedur ist), muss man explizit nil am Ende schreiben. Nah das wird wer machen. Also hat man nun unzählige Funktionen, die Sachen zurück geben, bei denen man sich nicht sicher sein kann ob das nur ein unabsichtlicher Seiteneffekt ist. Da muss man hoffen, dass die Funktion ausreichend dokumentiert wurde.
Shell Injections/Subprocesses
In Ruby 1.8 gibt es keinen Weg Injection-sicher Subprozesse aufzurufen und gleichzeitig den Ouput zu fangen. Die ` ` Syntax ist einfach nur Horror, weil es da natürlich alle Parameter zerlegt und in 1.8 kann man IO.popen nur einen String, kein Array, übergeben. Man müsste also Parameter selber escapen. Nur ist das OS (bzw. Shell) abhängig.
$-Variablen
Manche Dinge setzen kryptische $-Variablen als Seiteneffekte. Manchmal sogar als Globale Variablen (z.B. system und ` `)! Glaobal state. OMG.
Truth
Der Numerische Wert 0 ist in Ruby true. Zumal das in allen anderen (gängigen/mir bekannten) Sprachen in denen ein Numerischer Wert als Wahrheitswert verwendet werden könne false ergibt, ist das mal wieder eine super Bug Quelle. Ich hätte nichts dagegen, dass wenn man einen nicht-boolschen Wert in einer Bedingung verwendet man eine Exception bekommt. Das währe nur konsequent und würde solche Fehler verhindern. Aber so geht das gar nicht.
Es gibt keinen Bool(ean) Typen
Man muss echt überprüfen, ob eine Variable den Typen TrueClass oder FalseClass besitzt. Wessen geniale Idee war das den bitte? In der Typsysteme Vorlesung gepennt?
Redundante Methodennamen
Was soll das? Warum gibt es z.B. size und length? Was ist der Unterschied? Keiner? Warum gibts das dann? Und manchmal (z.B. ActiveRecord) gibt es auch ein count das ohne Parameter auch das selbe macht (naja, so ca.). Das führt zu super einheitlichen Code.
Mutable Strings
Wessen Idee war das schon wieder? In einer OO garbage collecteden Sprache kann man Strings doch nicht mutable machen! Wenn ich irgendeinem Objekt in einen Setter einen String übergebe erwarte ich das der Wert so bleibt wie er ist, aber bei mutable Strings kann der zu jeder Zeit unabhängig geändert werden. Es gibt kein const in solchen Sprachen! Genauso sollte man Listen nicht als Hash Keys verwenden dürfen. Für sowas sollte es Tupel geben.
Nix vergleichbares zu urllib2
Pythons urllib(2) ist ziemlich nett zu verwenden und sehr einfach zu erweitern. Hab z.B. mit ein paar Zeilen data:-URL Support hinzugefügt. Eine vergleichbare API gibt es für Ruby zumindest nicht in der stdlib.
Builtin Methodennamen
Ich mag Python's __*__ Namenskonvention für builtin Methodennamen. Wenn ich dann mit dir(obj) mir die Attribute und Methoden anzeigen lasse sind die __*__ Methoden an den Anfang sortiert und ich kann sie einfach ignorieren. Mit so Methodennamen wie "instance_variable_get" geht das nicht.
Ruby hat ein paar gute Ansätze, wurde aber mit extrem viel Müll verunstaltet, der offensichtlich von Leuten erdacht wurde, die keine Vorlesung zu Programmiersprachen/Typsysteme besucht haben.
@urllib2: Schau Dir mal Requests an Danach wirst Du nie mehr an ``urllib2`` denken
Hast du einen Link zur Doku? Das ist mal wieder so ein toller generischer Name nach dem man nicht googeln kann.
Nutze es als Allzwecksprache. PHP ist seit Ruby (on Rails) für mich gestorben. Python war aufgrund der Syntax nie eine Option für mich und Perl habe ich zur Seite gelegt als ich mir die Objektorientierung von Perl angeschaut habe. Ich verwende Ruby auch an Stellen wo man eher Shellscripting verwenden würde, da mir Shell in vielerlei Hinsicht auch nicht gefällt. Die Frage sollte eher lauten: Wer nutzt Ruby bitte nicht?
> Die Frage sollte eher lauten: Wer nutzt Ruby bitte nicht?
Gute Frage -- mach doch mal ne Umfrage. Ich vermute, unter den folgenden Programmieren haben die meisten noch nie etwas praktisches mit Ruby gemacht:
- Java Programmierer
- Webprogrammierer, die sich an PHP gewöhnt haben, weil das so weit verbreitet ist und für alles irgendwie funktioniert
- Leute, die Desktopsoftware in Python schreiben
- C/C++ Leute
Dieser Beitrag wurde 2 mal editiert. Zuletzt am 26. Feb 2013 um 14:54.Kurz: alle, die etwas anderes gelernt haben, das für sie funktioniert und die keine Zeit/Lust oder keinen Bedarf haben, etwas anderes zu lernen.
Dass etwas gut ist und gut funktioniert bedeutet nicht, dass es auch von vielen benutzt wird.
Leute die eine Programmiersprache für sich sterben lassen können, haben noch nichts sinnvolles programmiert!
Auch wenn ich von Java weg wollte,
was mache ich mit meinen, zum Teil mehr als 10 Jahre alten, Kundenprojekten?
Neu schreiben? Das zahlt kein Mensch!
Natürlich probiert man bei kleineren Geschichten mal was Neues.
Aber so revolutionär sind Python,Ruby und Konsorten auch wieder nicht.
Und ob man drei Zeichen bei einem Statement mehr oder weiniger eingeben muss, ist doch Bullshit.
Man schreibt doch sowieso nichts aus.
Das macht der Editor.
Bei ruby sind es vor allem die Konstruke die Möglich sind die es bei PHP nicht gibt. Außerdem ist die Möglichkeit Ruby zu erweitern dank Gems extrem einfach.
Kann sein dass es sowas auch in Perl oder Python gibt, in PHP meines Wissens aber noch nicht:
3.times { puts "Hello" }
nicht sonderlich sinnvoll, aber teilweise braucht man solche Konstrukte eben doch und sind dann doch einfacher und leserlicherlicher als eine for-Schleife.
Ruby ist sicherlich nicht perfekt und auch nicht für jedermann, aber ich denke die Aufgaben für die es verwendet wird, erfüllt es schon sehr gut und ich habe bisher keinen getroffen der mit Ruby gearbeitet hat und pauschal sagte, dass es er/sie es schlecht findet.