Конструкція case (часто її називають switch в інших мовах) належить до керуючих виразів, як if-else. Конструкція case дозволяє обʼєднувати кілька інструкцій if-else-if у ланцюжок і може бути зрозумілішою, водночас забезпечуючи керування потоком.
Конструкція case визначається ключовим словом case, після якого йде необовʼязковий вираз.
Далі для кожного case використовується ключове слово when, після якого йде вираз, що порівнюється з виразом case.
Ключове слово when не повинно мати відступу відносно ключового слова case.
Після ключового слова when розміщується код, який потрібно виконати, якщо вираз case збігається з виразом when.
Конструкція case дозволяє використовувати необовʼязкову інструкцію else, яка виконується, якщо жоден інший case не збігається.
Вираз 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
Конструкція case дозволяє зіставляти кілька виразів в одному case, де кожне можливе значення відокремлюється комою. Вона виконає код, якщо збігається хоча б один із виразів. Це може бути корисно, коли потрібно, щоб один case мав кілька можливих значень.
case var
when 1, 2
"One or two"
else
"Other"
end
Конструкція case також може перевіряти, чи значення належить діапазону. Для цього використовують діапазон як вираз when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Якщо вираз case не потрібен, його можна пропустити. Тоді кожен вираз case перевіряється на істинність. І вони поводяться як інструкції 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
У цій вправі ми змоделюємо перший хід гри в блекджек.
Ми отримаємо дві карти й зможемо побачити відкриту карту дилера. Усі карти подано як рядок тексту (англ. string), наприклад «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"
Залежно від наших двох карт і карти дилера існує стратегія для першого ходу гри, у якій у нас є такі варіанти:
Хоча вона ще не оптимальна, ми будемо дотримуватися стратегії, яку розробив наш друг Алекс. Ось вона:
Реалізуйте метод Blackjack.first_turn, який приймає три карти як аргументи у вигляді рядків тексту.
Метод має повернути рішення, яке нам слід ухвалити, як рядок тексту.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.