2009-07-10 16 views
19

Penso di capire come funziona un flip-flop grazie a un tutorial, ma l'esempio è concepito solo per l'insegnamento. Qualcuno può dare un esempio di come si è effettivamente utilizzato o si userebbe un flip-flop?Quando sarebbe utile un flip-flop Ruby?

Sto cercando un'applicazione del mondo reale, non solo un'altra dimostrazione. Quali problemi può risolvere questo strumento?

Il collegamento utilizzato era http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators, ma sembra essere spam oggigiorno.

risposta

20

Ecco un esempio (tratto da un rubycentral.com article) in cui si stampano solo alcune linee da un file:

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

Questo presuppone che un file con il seguente contenuto:

first 
second 
third 
fourth 
fifth 
sixth 

Il programma verrà stampato solo:

third 
fourth 
fifth 

L'idea è che il valore è true fino a quando si verifica l'evento a sinistra, quindi rimane true finché non si verifica l'evento a destra. Se usato correttamente, questo può essere un bel pezzo di zucchero sintattico, ma è necessario fare attenzione a rendere le cose leggibili.

+2

-1: codice non testato. Cosa ne pensi, perl? hai bisogno di 'print if ($ _ = ~/third /) .. ($ _ = ~/fifth /)' (so che non è il tuo codice, ma non c'è bisogno di continuare a diffondere il codice che usa funzionalità deprecate). – rampion

+0

Qual è l'uso effettivo per questo? Quando potrei aver bisogno di stampare dalla 3a alla 5a riga da un file (abbastanza volte per renderlo valido per la codifica)? – kajaco

+4

Dimentica 3 e 5. Si tratta di estrarre una sezione del file delimitata da un tag iniziale e un tag finale. Spero che tu veda meglio perché questo è un esempio del mondo reale. Ora l'equivalente versione non flip-flop implicherebbe l'aggiunta di variabili per lo stato, più istruzioni if: solo codice più complesso. – inger

4

L'evidenziazione di linee dispari/pari in tabelle HTML con molte righe sembra essere un caso d'uso valido.

Ho scritto qualcosa di non elegante come sopra diverse volte in passato quando si esegue il rendering di tabelle in Rails.

8

Vorrei aggiungere alla risposta di James alcuni esempi concreti. Ho usato questo operatore per estrarre sezioni di testo basate su espressioni regolari.

Stavo scrivendo uno strumento che implicava l'esecuzione di comandi su un server remoto tramite Net :: SSH. Questo particolare server aveva la fastidiosa abitudine di stampare un MOTD indipendentemente dal fatto che la sessione fosse o meno una sessione di accesso. Ciò ha comportato il recupero di molti rifiuti quando ho eseguito un comando e recuperato l'output. Dato che non avevo molta influenza sulla configurazione del server, creai un piccolo script che stampava un delimitatore, eseguiva il programma e poi stampava un altro delimitatore. L'output è stato simile a questo.

Welcome to Server X! 

+----------------------------------------------------------------------+ 
| Use of this server is restricted to authorized users only. User  | 
| activity may be monitored and disclosed to law enforcement personnel | 
| if any possible criminal activity is detected.      | 
+----------------------------------------------------------------------+ 

---------------------------------------------- 
    Setting up environment for user Adam. 
---------------------------------------------- 

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

L'operatore flip-flop è un collegamento utile per tirare fuori solo la sezione di codice con l'uscita avevo bisogno. Ho usato un'espressione regolare che corrispondeva a "25" maggiori di 25 per iniziare la partita e 25 meno di "<" per terminare la partita.

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

uscita

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

maggior parte degli esempi che ho visto hanno coinvolto tirando blocchi di dati da un file o gli array in base a espressioni regolari. Alcuni altri esempi che vengono in mente sono l'estrazione di conflitti di merge, alcuni record da file system legacy (come le strutture scritte nel file) e file di registro.

In pratica, in qualsiasi momento è necessario estrarre sezioni basate sui dati di inizio e fine anziché solo sul contenuto di una singola riga. È un po 'più complesso di una semplice regex, ma meno complessa della scrittura di un parser.

Problemi correlati