Case (a menudo llamado switch en otros lenguajes) es una forma de expresión de control como if-else. Case permite encadenar múltiples sentencias if-else-if y puede ser más legible a la vez que sigue proporcionando control de flujo.
Un case se define con la palabra clave case, seguida de una expresión opcional.
Luego, para cada case, se usa la palabra clave when seguida de una expresión que se compara con la expresión de case.
La palabra clave when no debe estar indentada con respecto a la palabra clave case.
Después de la palabra clave when va el código que debe ejecutarse si la expresión de case coincide con la expresión de when.
Case permite una sentencia else opcional que se ejecuta si ningún otro case coincide.
La expresión de case se evalúa y luego se compara con cada expresión de when.
La expresión se compara usando el operador de igualdad de case (===).
value = 1
case value
when 1
"One"
when 2
"Two"
else
"Other"
end
# This is the same as:
value = 1
if 1 === value
"One"
elsif 2 === value
"Two"
else
"Other"
end
===)El operador de igualdad de case (===) es un poco diferente del operador de igualdad (==).
El operador verifica si el lado derecho es un miembro del conjunto descrito por el lado izquierdo.
Esto significa que sí importa dónde se coloca cada operando.
Cómo funciona esto depende del tipo del lado izquierdo; por ejemplo, un Range verificaría si el lado derecho está dentro del rango, o un Object verificaría si el lado derecho es una instancia de Object.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
Case permite hacer coincidir múltiples expresiones en un solo case, con cada valor posible separado por una coma. Ejecutará el código si alguna de las expresiones coincide. Esto puede ser útil cuando quieres que un solo case tenga múltiples valores posibles.
case var
when 1, 2
"One or two"
else
"Other"
end
Case también puede verificar si un valor está dentro de un rango. Esto se hace usando un rango como expresión de when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Cuando no se necesita una expresión de case, es posible omitirla. Hacer esto hará que cada expresión de case se evalúe según su veracidad. Y hace que se comporten como sentencias if-else-if.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Ruby permite sentencias case de una sola línea.
Esto se puede usar cuando tienes una sentencia simple de una sola línea.
La sentencia when de una sola línea se escribe como when <expression> then <statement>.
Y cuando se usa en la sentencia else, se escribe como else <statement>.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
Case permite hacer coincidencias con tipos. Esto es útil cuando quieres un comportamiento diferente según el tipo de una variable.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
En este ejercicio vamos a simular el primer turno de una partida de Blackjack.
Recibirás dos cartas y podrás ver la carta boca arriba del crupier. Todas las cartas se representan con un string como «ace», «king», «three», «two», etc. Los valores de cada carta son:
| carta | valor | carta | valor |
|---|---|---|---|
| ace | 11 | eight | 8 |
| two | 2 | nine | 9 |
| three | 3 | ten | 10 |
| four | 4 | jack | 10 |
| five | 5 | queen | 10 |
| six | 6 | king | 10 |
| seven | 7 | other | 0 |
Comúnmente, los ases pueden tomar el valor de 1 o 11, pero por simplicidad asumiremos que solo pueden tomar el valor de 11.
Implementa el método Blackjack.parse_card, que recibe una carta como argumento, en forma de string.
El método debe devolver el valor de la carta como un número entero.
Blackjack.parse_card("ace")
# => 11
El puntaje del jugador tiene que clasificarse en rangos de valores. El puntaje del jugador se calcula sumando los valores de las dos cartas del jugador. Los rangos que se usan son:
| rango | valor |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Implementa el método Blackjack.card_range, que recibe dos cartas como argumentos, en forma de strings.
El método debe devolver el nombre del rango de valores en el que caen las dos cartas.
Blackjack.card_range("ten", "king")
# => "high"
Según tus dos cartas y la carta del crupier, existe una estrategia para el primer turno del juego, en la que tienes las siguientes opciones:
Aunque todavía no es óptima, seguirás la estrategia que tu amigo Alex ha estado desarrollando, que es la siguiente:
Implementa el método Blackjack.first_turn, que recibe tres cartas como argumentos, en forma de strings.
El método debe devolver, como string, la decisión que debes tomar.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.