Case (συχνά αναφέρεται ως switch σε άλλες γλώσσες) είναι μια μορφή έκφρασης ελέγχου ροής, όπως η if-else. Το case επιτρέπει τη σύνδεση πολλαπλών εντολών if-else-if και μπορεί να είναι πιο ευανάγνωστο, ενώ παράλληλα παρέχει έλεγχο ροής.
Ένα case ορίζεται από τη λέξη-κλειδί case που ακολουθείται από μια προαιρετική έκφραση.
Έπειτα, για κάθε περίπτωση, χρησιμοποιείται η λέξη-κλειδί when ακολουθούμενη από μια έκφραση που συγκρίνεται με την έκφραση του case.
Η λέξη-κλειδί when δεν πρέπει να έχει εσοχή σε σχέση με τη λέξη-κλειδί case.
Μετά τη λέξη-κλειδί when ακολουθεί ο κώδικας που πρέπει να εκτελεστεί αν η έκφραση του case ταιριάζει με την έκφραση του when.
Το case επιτρέπει μια προαιρετική εντολή else που εκτελείται αν δεν ταιριάζει καμία άλλη περίπτωση.
Η έκφραση του case αξιολογείται και στη συνέχεια συγκρίνεται με κάθε έκφραση when.
Οι εκφράσεις συγκρίνονται με τον τελεστή ισότητας 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
===)Ο τελεστής ισότητας case (===) διαφέρει λίγο από τον τελεστή ισότητας (==).
Ο τελεστής ελέγχει αν η δεξιά πλευρά είναι μέλος του συνόλου που περιγράφει η αριστερή πλευρά.
Αυτό σημαίνει ότι έχει σημασία πού τοποθετείται κάθε τελεστέος.
Το πώς λειτουργεί εξαρτάται από τον τύπο της αριστερής πλευράς· για παράδειγμα, ένα Range θα έλεγχε αν η δεξιά πλευρά βρίσκεται μέσα στο εύρος, ενώ ένα Object θα έλεγχε αν η δεξιά πλευρά είναι στιγμιότυπο του Object.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
Τα cases επιτρέπουν το ταίριασμα πολλαπλών εκφράσεων σε ένα μόνο case, με κάθε πιθανή τιμή να χωρίζεται με κόμμα. Ο κώδικας εκτελείται αν ταιριάζει οποιαδήποτε από τις εκφράσεις. Αυτό είναι χρήσιμο όταν θέλεις ένα case να έχει πολλαπλές πιθανές τιμές.
case var
when 1, 2
"One or two"
else
"Other"
end
Τα cases μπορούν επίσης να ελέγχουν αν μια τιμή βρίσκεται μέσα σε ένα εύρος. Αυτό γίνεται έχοντας ένα εύρος ως έκφραση when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Όταν δεν χρειάζεται έκφραση case, μπορείς να την παραλείψεις. Έτσι, κάθε έκφραση when αξιολογείται ως προς την αληθότητά της. Και έτσι συμπεριφέρονται σαν εντολές if-else-if.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Η Ruby επιτρέπει εντολές case σε μία γραμμή.
Αυτό μπορεί να χρησιμοποιηθεί όταν έχεις μια απλή εντολή μίας γραμμής.
Η εντολή when μίας γραμμής γράφεται ως when <expression> then <statement>.
Και όταν χρησιμοποιείται στην εντολή else, γράφεται ως else <statement>.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
Το case επιτρέπει το ταίριασμα με τύπους. Αυτό είναι χρήσιμο όταν θέλεις διαφορετική συμπεριφορά ανάλογα με τον τύπο μιας μεταβλητής.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
Σε αυτή την άσκηση θα προσομοιώσουμε την πρώτη κίνηση ενός παιχνιδιού Blackjack.
Θα λάβεις δύο φύλλα και θα μπορείς να δεις το ανοιχτό φύλλο του ντίλερ. Όλα τα φύλλα αναπαρίστανται με μια συμβολοσειρά, όπως "ace", "king", "three", "two" κ.λπ. Οι τιμές κάθε φύλλου είναι:
| φύλλο | τιμή | φύλλο | τιμή |
|---|---|---|---|
| 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 |
Συνήθως, οι άσσοι μπορούν να πάρουν την τιμή 1 ή 11, αλλά για λόγους απλότητας θα υποθέσουμε ότι μπορούν να πάρουν μόνο την τιμή 11.
Υλοποίησε τη μέθοδο Blackjack.parse_card, η οποία δέχεται ως όρισμα ένα φύλλο με τη μορφή συμβολοσειράς.
Η μέθοδος πρέπει να επιστρέφει την τιμή του φύλλου ως ακέραιο.
Blackjack.parse_card("ace")
# => 11
Το σκορ του παίκτη πρέπει να κατηγοριοποιηθεί σε εύρη τιμών. Το σκορ του παίκτη υπολογίζεται αθροίζοντας τις τιμές των δύο φύλλων του παίκτη. Τα εύρη που χρησιμοποιούνται είναι:
| εύρος | τιμή |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Υλοποίησε τη μέθοδο Blackjack.card_range, η οποία δέχεται ως ορίσματα δύο φύλλα με τη μορφή συμβολοσειρών.
Η μέθοδος πρέπει να επιστρέφει το όνομα του εύρους τιμών στο οποίο εμπίπτουν τα δύο φύλλα.
Blackjack.card_range("ten", "king")
# => "high"
Ανάλογα με τα δύο φύλλα σου και το φύλλο του ντίλερ, υπάρχει μια στρατηγική για την πρώτη κίνηση του παιχνιδιού, στην οποία έχεις τις εξής επιλογές:
Αν και δεν είναι ακόμη βέλτιστη, θα ακολουθήσεις τη στρατηγική που έχει αναπτύξει ο φίλος σου ο Alex, η οποία είναι η εξής:
Υλοποίησε τη μέθοδο Blackjack.first_turn, η οποία δέχεται ως ορίσματα τρία φύλλα με τη μορφή συμβολοσειρών.
Η μέθοδος πρέπει να επιστρέφει ως συμβολοσειρά την απόφαση που πρέπει να πάρεις.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Ruby με 21 έννοιες121 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.