Case (spesso chiamato switch in altri linguaggi) è una forma di espressione di controllo simile a if-else. Case permette di concatenare più istruzioni if-else-if e può risultare più leggibile pur offrendo comunque il controllo di flusso.
Un case è definito dalla parola chiave case seguita da un'espressione facoltativa. Poi, per ogni caso, si usa la parola chiave when seguita da un'espressione che viene confrontata con l'espressione del case. La parola chiave when non deve essere indentata rispetto alla parola chiave case. Dopo la parola chiave when c'è il codice che deve essere eseguito se l'espressione del case corrisponde all'espressione del when. Case permette di usare un'istruzione else facoltativa, che viene eseguita se nessun altro caso corrisponde.
L'espressione del case viene valutata e poi confrontata con ciascuna espressione del when. Il confronto avviene tramite l'operatore di uguaglianza del 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
===)L'operatore di uguaglianza del case (===) è un po' diverso dall'operatore di uguaglianza (==).
Questo operatore controlla se il lato destro è un membro dell'insieme descritto dal lato sinistro.
Questo significa che la posizione di ciascun operando conta davvero.
Il funzionamento dipende dal tipo del lato sinistro: per esempio, un Range controlla se il lato destro è compreso nell'intervallo, mentre un Object controlla se il lato destro è un'istanza di Object.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
Il case permette di far corrispondere più espressioni in un unico caso, separando ogni valore possibile con una virgola. Il codice viene eseguito se una qualsiasi delle espressioni corrisponde. Questo può essere utile quando vuoi che un singolo caso abbia più valori possibili.
case var
when 1, 2
"One or two"
else
"Other"
end
Il case può anche controllare se un valore è compreso in un intervallo. Per farlo, si usa un intervallo come espressione del when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Quando non c'è bisogno di un'espressione del case, è possibile ometterla. In questo modo, ogni espressione del when viene valutata in base alla sua veridicità, ed il case si comporta come una serie di istruzioni if-else-if.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Ruby permette di scrivere istruzioni case su una sola riga.
Puoi usarle quando hai una semplice istruzione su una sola riga.
L'istruzione when su una sola riga si scrive come when <expression> then <statement>.
E quando viene usata nell'istruzione else, si scrive come else <statement>.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
Il case permette di far corrispondere i tipi. Questo è utile quando si vuole un comportamento diverso a seconda del tipo di una variabile.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
In questo esercizio simuleremo il primo turno di una partita a Blackjack.
Riceverai due carte e potrai vedere la carta scoperta del mazziere. Tutte le carte sono rappresentate da una stringa come "ace", "king", "three", "two", ecc. I valori di ogni carta sono:
| carta | valore | carta | valore |
|---|---|---|---|
| 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 | altre | 0 |
Di solito gli assi possono valere 1 o 11, ma per semplicità assumeremo che possano valere solo 11.
Implementa il metodo Blackjack.parse_card, che prende una carta come argomento sotto forma di stringa.
Il metodo deve restituire il valore della carta come numero intero.
Blackjack.parse_card("ace")
# => 11
Il punteggio del giocatore deve essere suddiviso in intervalli di valori. Il punteggio del giocatore si calcola sommando i valori delle due carte del giocatore. Gli intervalli utilizzati sono:
| intervallo | valore |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Implementa il metodo Blackjack.card_range, che prende due carte come argomenti sotto forma di stringa.
Il metodo deve restituire il nome dell'intervallo di valori in cui rientrano le due carte.
Blackjack.card_range("ten", "king")
# => "high"
A seconda delle due carte che hai e della carta del mazziere, esiste una strategia per il primo turno del gioco, in cui hai le seguenti opzioni:
Anche se non è ancora ottimale, seguirai la strategia che il tuo amico Alex ha sviluppato, che è la seguente:
Implementa il metodo Blackjack.first_turn, che prende tre carte come argomenti sotto forma di stringa.
Il metodo deve restituire come stringa la decisione da prendere.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.