ruby flip-flop

¿Cuándo sería útil un flip-flop Ruby?



(3)

Creo que entiendo cómo funciona un flip-flop gracias a un tutorial, pero el ejemplo es idóneo solo para enseñar. ¿Alguien puede dar un ejemplo de cómo realmente ha usado o usaría un flip-flop?

Estoy buscando una aplicación del mundo real, no solo otra demostración. ¿Qué problemas puede resolver esta herramienta?

El enlace solía ser http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators , pero parece ser spam hoy en día.


Aquí hay un ejemplo (tomado de un artículo de rubycentral.com ) donde imprime solo ciertas líneas de un archivo:

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

Esto supone que tienes un archivo con el siguiente contenido:

first second third fourth fifth sixth

El programa solo imprimirá:

third fourth fifth

La idea es que el valor sea verdadero hasta que ocurra el evento de la mano izquierda, y luego se mantenga verdadero hasta que ocurra el evento de la mano derecha. Si se usa correctamente, puede ser una buena pieza de azúcar sintáctica, pero debe tener cuidado para que las cosas sean legibles.


El resaltado de línea par / impar en tablas HTML con muchas filas parecería ser un caso de uso válido.

He escrito algo que no es tan elegante como el anterior varias veces en el pasado al renderizar tablas en Rails.


Me gustaría agregar a la respuesta de James con algunos ejemplos concretos. He utilizado este operador para extraer secciones de texto basadas en expresiones regulares.

Estaba escribiendo una herramienta que implicaba ejecutar comandos en un servidor remoto a través de Net :: SSH. Este servidor en particular tenía el molesto hábito de imprimir un MOTD independientemente de si la sesión era una sesión de inicio de sesión o no. Esto dio como resultado que se recuperara mucha basura cuando ejecuté un comando y recuperé la salida. Como no tenía mucha influencia en la configuración del servidor, creé un pequeño script que imprimía un delimitador, ejecuté el programa y luego imprimí otro delimitador. La salida se veía algo así.

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 <<<<<<<<<<<<<<<<<<<<<<<<<

El operador de flip-flop fue un atajo útil para extraer solo la sección de código con la salida que necesitaba. Utilicé una expresión regular que coincidía con los 25 mayores que ">" para iniciar la coincidencia, y 25 menores que "<" para finalizar la coincidencia.

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

Salida

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

La mayoría de los ejemplos que he visto han involucrado la extracción de fragmentos de datos de un archivo o matrices basadas en expresiones regulares. Algunos otros ejemplos que vienen a la mente son sacar conflictos de combinación de git, ciertos registros de sistemas de archivos planos heredados (como estructuras escritas en un archivo) y archivos de registro.

Básicamente, cada vez que necesite extraer secciones basadas en datos de inicio y finalización en lugar de solo el contenido de una línea individual. Es un poco más complejo que una simple expresión regular, pero menos complejo que escribir un analizador.