Podobnie jak instrukcje if, które dają programowi możliwość podejmowania decyzji, instrukcje switch mogą być użyte do dodania odrobiny inteligencji do każdego programu. W rzeczywistości, instrukcja switch jest w zasadzie wyspecjalizowaną wersją instrukcji if, która w przeciwnym razie zawierałaby nadmierną ilość instrukcji typu ELSE IF
.
Przyjrzyjmy się, dlaczego są one używane.
Czasami, podczas wprowadzania logiki do swoich programów, natkniesz się na sytuację, w której biorąc pod uwagę wartość pewnej części danych, będziesz chciał zrobić coś innego. Normalnie można to zrobić za pomocą instrukcji if, ale co jeśli chcesz uwzględnić 5, 10, a nawet 20 możliwych sytuacji?
Używając instrukcji if, twój program szybko stałby się plątaniną składni instrukcji if, i nie byłby zbyt czytelny ani jasny co się w nim dzieje. Programiści zdali sobie z tego sprawę i tak narodziły się instrukcje switch!
Sztuka instrukcji switch
Konstrukcja switch pobiera pojedynczą wartość, a następnie porównuje ją z wieloma innymi wartościami za pomocą wyrażenia boolean. Gdy jedno z tych wyrażeń boolean jest prawdziwe, wtedy zostanie wykonany określony fragment kodu.
Ta struktura pozwala na łatwe mapowanie wartości do fragmentu kodu, który powinien zostać wykonany. Spójrz na prostą instrukcję switch poniżej, aby zapoznać się z jej składnią w Rubim:
Copymy_grade = "A "case my_grade when "A" puts "You Pass" when "F" puts "You fail" else puts "Invalid grade "end
Jak widać powyżej, zaczynamy od wartości myGrade
. Zasadniczo chcemy wydrukować czy student zdał czy nie, biorąc pod uwagę jego ocenę (A lub F).
Teraz, gdy mamy naszą wartość, chcemy ustawić serię instrukcji case. Te instrukcje przypadków są w zasadzie prawą stroną wyrażenia boolean dla równości. Ruby porówna myGrade
do każdej z wartości w wyrażeniu case (’A' i 'F') pod kątem równości. Jeśli jest zgodność, zostanie wykonany kod znajdujący się bezpośrednio pod instrukcją case.
Przełączniki
Jedną z rzeczy, o których należy pamiętać w instrukcjach switch jest to, że domyślnie Ruby będzie próbował sprawdzić wszystkie z nich pod kątem równości, nawet jeśli uzyska zgodność. Różni się to od struktury ELSE IF
, gdzie gdy warunek jest prawdziwy, przestaje sprawdzać te poniżej.
Ponieważ Ruby będzie automatycznie sprawdzał każdy przypadek bez względu na wszystko, potrzebujemy sposobu aby temu zapobiec (przez większość czasu chcesz temu zapobiec). W przypadku dopasowania, chcę aby switch przestał sprawdzać pozostałe przypadki.
W tym miejscu pojawia się słowo kluczowe break
. Słowo kluczowe break mówi Rubiemu, że skończyliśmy z instrukcją switch, i powinien się z niej wyłamać i przejść dalej.
Prywatnie napotkałem sporo błędów w programach, które napisałem zapominając o wstawieniu instrukcji break. Więc miej to z tyłu głowy.
Default
Jeśli przeanalizujesz powyższą instrukcję switch, zauważysz również słowo kluczowe default
. To słowo kluczowe działa podobnie jak ELSE
w strukturze instrukcji if. Każdy kod poniżej domyślnej instrukcji zostanie wykonany, jeśli żaden z pozostałych przypadków nie zostanie dopasowany. Zauważ również, że nie potrzebujemy instrukcji break wewnątrz default.
Generalnie, gdy mamy do czynienia z sytuacją, w której używamy switcha, domyślna instrukcja po prostu wyłapie wszystkie sytuacje, których nie chcemy określać w instrukcji case.
W przypadku powyższego programu wypisuje on Invalid Grade
dla każdej klasy, która nie jest A
lub F
.
Wrapping it up
W praktyce, switch statement są używane znacznie rzadziej niż if statements. Powodem tego jest fakt, że jest znacznie mniej sytuacji, w których instrukcja switch jest odpowiedniejsza od instrukcji if. Dobrą zasadą jest jednak to, że jeśli musisz sprawdzić jedną wartość względem kilku innych wartości pod kątem równości, to możesz potrzebować switcha!