2009-07-10 7 views
19

Je pense que je comprends comment fonctionne une bascule grâce à un tutoriel, mais l'exemple là-bas est conçu uniquement pour l'enseignement. Quelqu'un peut-il donner un exemple de la façon dont vous avez réellement utilisé ou utiliseriez une bascule?Quand une bascule Ruby serait-elle utile?

Je cherche une application dans le monde réel, pas seulement une autre démonstration. Quels problèmes cet outil peut-il résoudre?

Le lien utilisé pour être http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators, mais semble être du spam ces jours-ci.

Répondre

20

Voici un exemple (tiré d'un rubycentral.com article) où vous imprimez seulement certaines lignes à partir d'un fichier:

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

Cela suppose que vous avez un fichier avec le contenu suivant:

first 
second 
third 
fourth 
fifth 
sixth 

Le programme imprimera seulement:

third 
fourth 
fifth 

L'idée est qu'il la valeur est true jusqu'à ce que l'événement de gauche se produise, puis reste vrai jusqu'à ce que l'événement de droite se produise. Si utilisé correctement, cela peut être un bon morceau de sucre syntaxique, mais vous devez faire attention à rendre les choses lisibles.

+2

-1: code non testé. Que penses-tu que c'est, perl? vous avez besoin de 'print if ($ _ = ~/third /) .. ($ _ = ~/fifth /)' (Je sais que ce n'est pas votre code, mais il n'est pas nécessaire de continuer à diffuser du code utilisant des fonctionnalités obsolètes). – rampion

+0

Quelle est l'utilisation réelle pour cela? Quand pourrais-je avoir besoin d'imprimer les 3ème à 5ème lignes à partir d'un fichier (assez de fois pour que ça en vaille la peine)? – kajaco

+4

Oubliez environ 3 et 5. Il s'agit d'extraire une section du fichier délimitée par une balise de début et une balise de fin. J'espère que vous voyez mieux pourquoi c'est un exemple du monde réel. Maintenant, la version non-flip-flop équivalente impliquerait l'ajout de variables pour l'état, plus si les instructions: juste un code plus complexe. – inger

4

La mise en surbrillance de lignes impaires/paires dans les tableaux HTML avec plusieurs lignes semble être un cas d'utilisation valide.

J'ai écrit quelque chose d'aussi peu élégant que ce qui précède plusieurs fois dans le passé lors du rendu de tables dans Rails.

8

Je voudrais ajouter à la réponse de James quelques exemples concrets. J'ai utilisé cet opérateur pour extraire des sections de texte basées sur des expressions régulières. J'écrivais un outil qui impliquait l'exécution de commandes sur un serveur distant via Net :: SSH. Ce serveur particulier avait la fâcheuse habitude d'imprimer un MOTD, que la session soit une session de connexion ou non. Cela a eu pour résultat de récupérer beaucoup de déchets lorsque j'ai exécuté une commande et récupéré la sortie. Comme je n'avais pas beaucoup d'influence sur la configuration du serveur, j'ai créé un petit script qui imprimait un délimiteur, exécutait le programme et imprimait un autre délimiteur. La sortie ressemblait à ceci.

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'opérateur bascule est un raccourci utile pour retirer seulement la section de code avec la sortie que je avais besoin. J'ai utilisé une regex qui correspondait aux 25 plus grands que les ">" pour commencer le match, et 25 moins que les "<" pour terminer le match.

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

Sortie

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

La plupart des exemples que j'ai vu ont impliqué en tirant des blocs de données d'un fichier ou des tableaux basés sur des expressions régulières. Certains autres exemples qui viennent à l'esprit sont tirant sur les conflits de fusion git, certains enregistrements de systèmes de fichiers plats hérités (comme les structures écrites dans le fichier), et les fichiers journaux. Fondamentalement, à chaque fois que vous devez extraire des sections en fonction des données de début et de fin plutôt que du contenu d'une seule ligne. C'est un peu plus complexe qu'une simple regex, mais moins complexe que l'écriture d'un analyseur.