en la mayoría de los lenguajes de computadora , la instrucción case o condicional (también conocida como switch ) compara el valor de una variable con el de varias constantes o literales y ejecuta la primera ruta con un caso coincidente. en ruby , es un poco más flexible (y potente).
en lugar de realizar una simple prueba de igualdad, se utiliza el operador de igualdad de casos, lo que abre la puerta a muchos usos nuevos.
Sin embargo, hay algunas diferencias con otros idiomas. en c , una declaración de cambio es un tipo de reemplazo para una serie de declaraciones if y goto . los casos son técnicamente etiquetas, y la declaración de cambio irá a la etiqueta correspondiente. Esto exhibe un comportamiento llamado "fallthrough", ya que la ejecución no se detiene cuando llega a otra etiqueta.
Por lo general, esto se evita mediante una declaración de interrupción, pero la falla a veces es intencional. la declaración del caso en ruby, por otro lado, puede verse como una abreviatura de una serie de declaraciones if . no hay fallthrough, solo se ejecutará el primer caso coincidente.
la forma básica de una declaración de caso
La forma básica de una declaración de caso es la siguiente.
como puede ver, esto está estructurado de manera similar a una declaración condicional if / else if / else. el nombre (que llamaremos el valor ), en este caso ingresado desde el teclado, se compara con cada uno de los casos de las cláusulas when (es decir, casos ), y el primer bloque when con un caso coincidente se ejecutará. Si ninguno de ellos coincide, se ejecutará el bloque else .
Lo interesante aquí es cómo se compara el valor con cada uno de los casos. como se mencionó anteriormente, en c ++ y otros lenguajes similares a c, se utiliza una comparación de valores simple. en ruby, se usa el operador de igualdad de casos.
recuerde que el tipo del lado izquierdo de un operador de igualdad de casos es importante, y los casos son siempre el lado izquierdo. entonces, para cada cláusula when , ruby evaluará el valor del caso === hasta que encuentre una coincidencia.
si tuviéramos que ingresar bob , ruby primero evaluaría "alice" === "bob" , lo cual sería falso ya que string # === se define como la comparación de las cadenas. a continuación, /[qrzfont>.+/i === "bob" se ejecutará, lo cual es falso ya que bob no comienza con q, r o z.
Como ninguno de los casos coincide, Ruby ejecutará la cláusula else.
cómo entra en juego el tipo
Un uso común de la declaración del caso es determinar el tipo de valor y hacer algo diferente dependiendo de su tipo. Aunque esto rompe el tipeo habitual del pato de Ruby, a veces es necesario hacer las cosas.
esto funciona usando el operador de clase # === (técnicamente, el módulo # === ), que prueba si el lado derecho es_a? lado izquierdo.
La sintaxis es simple y elegante:
otra forma posible
si se omite el valor , la declaración de caso funciona de manera un poco diferente: funciona casi exactamente como una declaración if / else if / else. las ventajas de utilizar la declaración de caso sobre un caso de declaración, en este caso, son meramente cosméticos.
una sintaxis más compacta
Hay momentos en que hay una gran cantidad de pequeñas cláusulas when . Tal declaración de caso fácilmente crece demasiado para caber en la pantalla. cuando este es el caso (sin juego de palabras), puede usar la palabra clave then para colocar el cuerpo de la cláusula when en la misma línea.
Si bien esto genera un código muy denso, siempre y cuando cada cláusula sea muy similar, en realidad se vuelve más legible.
cuando debe usar una sola línea y varias líneas cuando las cláusulas dependen de usted, es cuestión de estilo. sin embargo, no se recomienda mezclar los dos: una declaración de caso debe seguir un patrón para que sea lo más legible posible.
asignación de caso
como las declaraciones if, las declaraciones case evalúan hasta la última declaración en la cláusula when . en otras palabras, se pueden usar en tareas para proporcionar una especie de tabla. sin embargo, no olvide que las declaraciones de casos son mucho más poderosas que las matrices simples o las búsquedas hash. dicha tabla no necesariamente necesita usar literales en las cláusulas when .
si no hay coincidencia cuando la cláusula y ninguna otra cláusula, la declaración del caso se evaluará como nula .