mawe hat geschrieben:Überhaupt nicht! Ich meine, ja, es ist länger, aber ausserdem auch fürchterlich unlesbar

. Das ist ja meiner Meinung nach das Schöne an den LC im Python: die Einfachheit und Lesbarkeit.
es stimmt, dass die LC mit keywords statt klammern viel simpler aussieht. und meist braucht man wohl auch nur for und if.
codeblöcke können mehr (eigentlich alles was als callback darstellbar ist - for ist da nur ein spezialfall. stellt euch vor, ihr könntet methoden definieren, die ihr dann wie if und for verwenden könnt!)
und es gibt diese "Domino-optik":
Code: Alles auswählen
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
schau mal wie weit auseinander i und j jeweils stehen. die reihenfolge bzw. die verbindung der for's ist gar nicht erkennbar, einerseits arbeitet die LC von rechts nach links (rechts erzeugen, links berechnen) und dann wieder von links nach rechts (erst for i dann for j.)
mein workaround ist zwar hässlich, aber deutlicher:
Code: Alles auswählen
noprimes = list { (2..8).each { |i| (i*2..50).step(i) { |j| add j } } }
i zu i, j zu j (wie beim Domino.) nur eine richtung. klare klammerung.
trotzdem wäre es schön, LC in Ruby zu haben. aber so etwas wie in Python ist schwer vereinbar mit den bisherigen regeln. es müsste tatsächlich ein ganz neues konstrukt her.
Milan hat geschrieben:Hi. Dein Code gibt bei mir das hier aus:
Code: Alles auswählen
-:2: undefined method `step' for #<Range:0x401407fc> (NameError)
du hast ein altes Ruby. früher hätte man i*2.step(50, i) schreiben müssen. ich mag Range#step lieber.