2009-07-10 11 views
19

Ich denke, ich verstehe, wie ein Flip-Flop funktioniert dank eines Tutorials, aber das Beispiel dort ist nur für den Unterricht konzipiert. Kann jemand ein Beispiel geben, wie du tatsächlich ein Flip-Flop benutzt hast oder benutzen würdest?Wann wäre ein Ruby-Flipflop nützlich?

Ich bin auf der Suche nach einer realen Anwendung, nicht nur eine weitere Demonstration. Welche Probleme kann dieses Tool lösen?

Der Link war http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators, scheint aber in diesen Tagen Spam zu sein.

Antwort

20

Hier ist ein Beispiel (aus einem rubycentral.com article genommen), wo man nur bestimmten Zeilen aus einer Datei ausdrucken:

file = File.open("ordinal") 
while file.gets 
    print if ($_ =~ /third/) .. ($_ =~ /fifth/) 
end 

Dies setzt voraus, dass Sie mit dem folgenden Inhalt haben Sie eine Datei:

first 
second 
third 
fourth 
fifth 
sixth 

Das Programm wird nur ausdrucken:

third 
fourth 
fifth 

Die Idee ist, dass es Der Wert ist wahr, bis das Ereignis links auftritt und bleibt dann wahr, bis das Ereignis rechts auftritt. Bei richtiger Verwendung kann dies ein schönes Stück syntaktischen Zucker sein, aber Sie müssen vorsichtig sein, um die Dinge lesbar zu machen.

+2

-1: ungetesteter Code. Was denkst du ist das, Perl? Du brauchst 'print if ($ _ = ~/third /) .. ($ _ = ~/fifth /)' (Ich weiß, dass es nicht dein Code ist, aber es ist nicht nötig, Code weiter zu verbreiten, der veraltete Features verwendet). – rampion

+0

Was ist die tatsächliche Verwendung dafür? Wann muss ich die 3. bis 5. Zeile aus einer Datei drucken (genug, um es zu kodieren)? – kajaco

+4

Vergessen Sie 3 und 5. Es geht darum, einen Abschnitt der Datei zu extrahieren, der durch ein Begin-Tag und ein End-Tag getrennt ist. Ich hoffe, du siehst besser, warum das ein Beispiel aus der realen Welt ist. Jetzt würde die äquivalente Nicht-Flip-Flop-Version das Hinzufügen von Variablen für den Zustand, mehr if-Anweisungen beinhalten: nur komplexerer Code. – inger

4

Seltsame/gerade Linie Hervorhebung in HTML-Tabellen mit vielen Zeilen scheint ein gültiger Anwendungsfall zu sein.

Ich habe etwas nicht so elegant wie oben beschrieben in der Vergangenheit beim Rendern von Tabellen in Rails geschrieben.

8

Ich möchte die Antwort von James mit einigen konkreten Beispielen hinzufügen. Ich habe diesen Operator verwendet, um Textabschnitte basierend auf regulären Ausdrücken herauszuziehen.

Ich schrieb ein Tool, das das Ausführen von Befehlen auf einem Remote-Server über Net :: SSH beinhaltete. Dieser spezielle Server hatte die lästige Angewohnheit, einen MOTD zu drucken, unabhängig davon, ob die Sitzung eine Login-Sitzung war oder nicht. Dies führte dazu, dass ich viel Müll zurückbekam, als ich einen Befehl ausführte und die Ausgabe abrief. Da ich bei der Serverkonfiguration nicht viel Einfluss hatte, habe ich ein kleines Skript erstellt, das ein Trennzeichen ausgedruckt, das Programm ausgeführt und dann ein weiteres Trennzeichen gedruckt hat. Die Ausgabe sah ungefähr so ​​aus.

Der Flip-Flop-Operator war eine nützliche Abkürzung, um nur den Codeabschnitt mit dem benötigten Ausgang herauszuziehen. Ich verwendete eine Regex, die den 25 Größer-Thans ">" entsprach, um das Match zu beginnen, und 25 weniger Thans "<", um das Match zu beenden.

output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] } 

Ausgabe

>>>>>>>>>>>>>>>>>>>>>>>>> 
Program Output 
<<<<<<<<<<<<<<<<<<<<<<<<< 

Die meisten Beispiele Ich habe Stücke von Daten aus einer Datei oder eines Arrays beteiligt haben gesehen auf regulären Ausdrücken basiert ziehen. Einige andere Beispiele, die mir in den Sinn kommen, sind der Zusammenbruch von Git-Konflikten, bestimmten Datensätzen aus Legacy-Flat-File-Systemen (wie in Dateien geschriebene Strukturen) und Log-Dateien.

Grundsätzlich müssen Sie jederzeit Abschnitte basierend auf Anfangs- und Enddaten herausziehen, anstatt nur den Inhalt einer einzelnen Zeile. Es ist ein bisschen komplexer als nur eine einfache Regex, aber weniger komplex als ein Parser zu schreiben.