case (al que en otros lenguajes se suele llamar switch) es una forma de expresión de control, similar a if-else.
case permite encadenar varias sentencias if-else-if, puede ser más legible y permite construir estructuras potentes.
Un case se define con la palabra clave case seguida de una expresión opcional.
Luego, para cada caso se usa la palabra clave when seguida de una expresión que se compara con la expresión del case.
La palabra clave when no debe tener más sangría que la palabra clave case.
Después de la palabra clave when va el código que debe ejecutarse si la expresión del case coincide con la expresión del when.
case permite una sentencia else opcional que se ejecuta si ningún otro caso coincide.
La expresión del case se evalúa y luego se compara con cada expresión del when.
La comparación se hace con el operador de subsunción de case (===).
case 1
when 1
puts "One"
when 2
puts "Two"
else
puts "Other"
end
# => One
# This is the same as:
tmp = 1
if 1 === tmp
puts "One"
elsif 2 === tmp
puts "Two"
else
puts "Other"
end
case (===)El operador de subsunción de case (===) es un poco diferente del operador de igualdad (==).
El operador comprueba si el lado derecho es un miembro del conjunto que describe el lado izquierdo.
Esto significa que sí importa dónde se coloca cada operando.
Cómo funciona depende del tipo del lado izquierdo; por ejemplo, un Range comprobaría si el lado derecho está dentro del rango, o un Object comprobarí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 con varias expresionesLos case permiten hacer coincidir varias expresiones en un solo caso, con cada valor posible separado por una coma.
Ejecutará el código si alguna de las expresiones coincide.
Esto puede ser útil para un solo caso con varios valores posibles.
case 1
when 1, 2
puts "One or two"
else
puts "Other"
end
case con rangosLos case también pueden comprobar si un valor está dentro de un rango.
Esto se hace usando un rango como expresión del when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
case sin expresión de case
Cuando no se necesita una expresión de case, es posible omitirla.
Al hacerlo, cada expresión se evalúa según su veracidad.
Y hace que se comporten como sentencias if-else-if.
case
when 1 == 1
puts "One is equal to one"
when 1 > 2
puts "One is greater than two"
else
puts "Other"
end
when en una sola líneaCrystal permite sentencias case de una sola línea.
Esto se puede usar cuando tienes una sentencia simple de una sola línea.
El 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 puts "One"
when 2 then puts "Two"
else puts "Other"
end
case con tiposcase permite hacer coincidir con tipos.
La comparación usará el operador is_a? para comprobar el tipo de la variable.
Por ejemplo, esto permite una rama para cada tipo en un tipo unión.
case var
when Int32
puts "Int32"
when String
puts "String"
else
puts "Other"
end
case permite usar un objeto implícito.
Esto permite, por ejemplo, que una expresión del when sea una llamada a un método sobre la expresión del case.
Según si el método devuelve un valor verdadero o falso, el caso coincidirá o no.
case 1
when .odd?
puts "Odd"
when .even?
puts "Even"
end
En este ejercicio simularemos el primer turno de una partida de Blackjack.
Recibirás dos cartas y podrás ver la carta descubierta 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 |
Por lo general, 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 string en un argumento.
El método debe devolver el valor de la carta como un número entero.
Blackjack.parse_card("ace")
# => 11
El puntaje del jugador se debe clasificar 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 strings en argumentos.
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, hay 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 strings en argumentos.
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 Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.