2010-01-22 5 views
7

Ich bin ein Java/C++ Programmierer und Ruby ist meine erste Skriptsprache. Ich finde manchmal, dass ich es nicht so produktiv nutze, wie ich es in einigen Bereichen, wie diesem, zum Beispiel tun könnte:Quick Advice: Wie sollte das in Ruby geschrieben werden?

Ziel: nur bestimmte Zeilen aus einer Datei analysieren. Das Muster, mit dem ich gehe, ist, dass es eine sehr große Linie mit einer Größe größer als 15 gibt, der Rest ist definitiv kleiner. Ich möchte alle Zeilen ignorieren (und einschließlich) die große Zeile.

def do_something(str) 
    puts str 
end 


str = 
'ignore me 
me too! 
LARGE LINE ahahahahha its a line! 
target1 
target2 
target3' 

flag1 = nil 
str.each_line do |line| 
    do_something(line) if flag1 
    flag1 = 1 if line.size > 15 
end 

ich schrieb, aber ich denke, es ist viel besser geschrieben werden könnte, das heißt, es muss eine Flagge ein besserer Weg, als die Einstellung. Empfehlungen, wie man schöne Zeilen von Ruby schreibt, sind ebenfalls willkommen.

Hinweis/Erläuterung: Ich muss alle Zeilen NACH dem ersten Erscheinen der großen Linie drucken.

+0

Können Sie "besser" definieren Ihre do Schleife macht genau das, was Sie wollen, in nur ein paar Zeilen Code und es ist sehr einfach zu lesen und die Absicht zu verstehen. – Beanish

+0

Besser nicht durch Leistung, aber besser aussehend. Die bisherigen Beispiele sind das, wonach ich suche (meistens, wenn nur die Leute die Klärung besser lesen würden). – Zombies

Antwort

10
str.lines.drop_while {|l| l.length < 15 }.drop(1).each {|l| do_something(l) } 

Ich mag diese, denn wenn man es von links nach rechts zu lesen, ist es fast genau wie Ihre Original-Beschreibung lautet:

Split die Zeichenfolge in Zeilen und Stichleitungen kürzer als 15 Zeichen. Dann lege eine andere Zeile (d. H. Die erste mit mehr als 14 Zeichen) ab. Dann mach etwas mit jeder verbleibenden Linie.

Sie müssen nicht einmal unbedingt Ruby verstehen oder überhaupt programmieren, um zu überprüfen, ob dies richtig ist.

+0

Sie können diesen zusätzlichen Drop loswerden, wenn Sie die Bedingung zu <= ändern. Wusste nie über drop_while. Vielen Dank! – Farrel

+0

@Farrel: Nein, du kannst nicht. Wenn die lange Linie mehr als 15 Zeichen hat, wird sie genau wie zuvor funktionieren. Wenn es genau 15 Zeichen hat, wird nur die ganze Zeichenfolge fallengelassen. – sepp2k

+0

Farrel: Wenn die lange Zeile mehr als 15 Zeichen lang ist (wie im Beispiel), benötigen Sie den zusätzlichen Drop. Außerdem muss ich zustimmen, dass drop_while ziemlich ordentlich ist. – abeger

3
require 'enumerator' # Not needed in Ruby 1.9 

str.each_line.inject(false) do |flag, line| 
    do_something(line) if flag 
    flag || line.size > 15 
end 
1
lines = str.split($/) 
start_index = 1 + lines.find_index {|l| l.size > 15 } 
lines[start_index..-1].each do |l| 
    do_something(l) 
end 
+0

funktioniert das in 1.8.6? Ich bekomme undefinierte Methode 'Linien' Fehler – Zombies

+0

Nein, Linien ist neu in 1.8.7. Ich werde die Antwort aktualisieren, um Split zu verwenden. – mckeed

+0

In 1.8.6 werden Strings bereits als Array von Zeilen betrachtet, daher brauchen Sie sie nicht. In 1.9 werden Zeichenfolgen jedoch als ein Array von Zeilen, Zeichen, Bytes oder Codepunkten betrachtet. Daher müssen Sie explizit angeben, welches Verhalten Sie wünschen. –

Verwandte Themen