Sonderzeichen, nicht nur in Perl (was: Warum ich Ruby nicht mag...)

Ich bin mal wieder bei einem Ruby-Tutorial hängen geblieben und musste mir das unbedingt ansehen. Doch auf der vierten (und letzten Seite) wurde mir dann wieder bewusst, warum ich Ruby nicht mag:

@names.each do |name|
puts "Hallo, #{name}!"
end

Err, jaanee, is klar. Wozu "@names" (statt "names"), wieso "|name|" (statt "name") und warum zur Hölle "#{name}"? Bei dieser Ansammlung von Sonderzeichen hier kann ich gleich wieder Perl programmieren...

Apropos Perl:

foreach my $name (@NAMES) {
print $name."\n";
}

Sieht ja in dem Fall fast noch erträglich aus (IMHO erträglicher als Ruby, wobei man sich natürlich auch nach dem Sinn und Zweck des "@" fragen muss - insbesondere im Gegensatz/Vergleich zum "$". YMMV.)

Wie würde es in Python aussehen? So:

for name in names:
print "Hallo, %s!" % name
# Alternativ: print "Hallo, " + foo + "!"

Bei der Ausgabe fällt mir auf, dass wir schon bei PHP verflucht haben, dass man einfach "$name" irgendwo in den String reinschreibt (ähnlich wie bei dem Ruby-Beispiel oben) - so von wegen saubere Trennung von Variablen und Strings... Ja, geht bestimmt bei Ruby auch anders, ich weiß. Allgemein fällt mir dazu auf, dass da jede Sprach wohl so seine Eigenheiten hat. Ich hab mich in Python auf die "Platzhalter-Syntax" eingeschossen, ist mir symaptischer als die Alternativ-Variante.

PS: Kommentare ausdrücklich erwünscht!

Trackback URL for this post:

http://velt.de/trackback/201
from ukeerBlog on Sa, 2008-02-02 10:12

In the german Blog of a colleague of mine i found an entry about Ruby and non-alphanumeric chars.
He's ranting about how ruby uses special chars to name variables and asks why this is so.
The example he has taken is this:

@names.each do

from Robinayor_s Webtagebuch on Mi, 2008-01-16 18:33

Tja lieber Sven,
sag mir doch bitte mal welches Ruby-Tutorial das war..
Ich erkläre dir nun auf jeden Fall mal mit eigenen Worten, warum der Code (so, ohne Kontext) quatsch ist, was was bedeutet, und wie du ihn auch in Ruby mit weniger Sonderzeich...

Da hast du etwas nicht ganz verstanden

Wenn du so drauf stehst, warum schreibst du nicht einfach

for name in names do
puts "Hallo, " + name
end

Ich komme aus der Rubyecke und gucke mir Python seit einiger Zeit an, und muss sagen das die *wirklichen* Unterschiede minimal sind. Ob ich jetzt self schreibe oder ein @ um eine Klassenvariable zu kennzeichen ist doch eigentlich schnuppe. Pythons ständige self.__sonstwas__ sind auch nicht besonders hübsch. Die unnötigen selfs halten sich ungefähr mit den unnötigen ends die Waage.

Ruby hat ein paar schöne Kniffe die mir fehlen, z.b. das ich die Kontrollbedingung nach hinten schieben kann, das Keywort unless (für if !=), die oder gleich schreibweise (@kontostand ||=0 anstatt @kontostand = 0 unless @kontostand), die Symbole (weil mein editor die anders darstellen kann als strings)... Dafür gefällt mir die Einrückung bei Python tausendmal besser als bei Ruby.

Das folgende Beispiel ist leider keine Seltenheit und wird durch die - meines Erachtens nach leichtsinnige - Konvention von nur zwei Leerzeichen pro Einrückungslevel noch verschärft

module Foo
class bar
attr_accessor :foobars
def foobar
@foobars.each do |foobar|
puts foobar
end
puts "barFoo!!!"
end
end
end

Ich finde allerdings, dass der Lernaufwand der benötigt wird um die Blocksyntax zu beherrschen, geringer ist als der Lernaufwand der erforderlich ist um Decorators, Listennotation und die anderen Techniken zu verstehen, die in Ruby allesamt mit den Block-Continuations realisiert werden. Trotz der sehr viel besseren Pythondoku ist Ruby besser strukturiert - die Objektorientierung ist so konsequent durchgezogen das man zumindest sehr schnell weiß wo man suchen muss - will ich etwas mit dateien machen gucke ich in der File class. Will ich etwas mit arrays machen gucke ich zuerst was ein Array-Objekt so kann. Von dem Standpunkt aus finde ich es ziemlich schade das Funktionen wie map() in Python nicht als Methoden von Collections implementiert sind.

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.
  • You may link to Gallery2 items on this site using a special syntax.

Weitere Informationen über Formatierungsoptionen

To combat spam, please enter the code in the image.
Inhalt abgleichen
Powered by Olark