The Many Uses Of Ruby Case Statements

Gdy potrzebujesz użyć jakiegoś if / elsif stwierdzenia, możesz rozważyć użycie Ruby case statement zamiast tego. W tym poście poznasz kilka różnych przypadków użycia i dowiesz się jak to wszystko naprawdę działa pod maską.

ruby case

Uwaga: W innych językach programowania jest to znane jako switch.

Komponenty instrukcji case w Ruby:

Słowo kluczowe Opis
case Uruchamia definicję instrukcji case. Pobiera zmienną, z którą zamierzasz pracować.
when Każdy warunek, który może być dopasowany to jedna instrukcja when.
else Jeśli nic nie pasuje to zrób to. Optional.

Ruby Case & Zakresy

Oświadczenie case jest bardziej elastyczne niż mogłoby się wydawać na pierwszy rzut oka. Zobaczmy przykład, w którym chcemy wydrukować jakąś wiadomość w zależności od tego, do jakiego zakresu należy dana wartość.

case capacitywhen 0 "You ran out of gas."when 1..20 "The tank is almost empty. Quickly, find a gas station!"when 21..70 "You should be ok for now."when 71..100 "The tank is almost full."else "Error: capacity has an invalid value (#{capacity})"end

Myślę, że ten kod jest całkiem elegancki w porównaniu z tym, jak wyglądałaby wersja if / elsif.

Ruby Case & Regex

Możesz również użyć wyrażeń regularnych jako swojego when warunku. W poniższym przykładzie mamy serial_code z początkową literą, która mówi nam, jak ryzykowny jest ten produkt do spożycia.

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Kiedy nie używać Ruby Case

Gdy masz proste mapowanie 1:1, możesz pokusić się o zrobienie czegoś takiego.

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

W mojej opinii lepiej byłoby zrobić to zamiast tego:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

Rozwiązanie hash jest bardziej wydajne i łatwiejsze do pracy. Nie sądzisz?

Jak działa case: metoda ==

Możesz się zastanawiać, jak case działa pod maską. Jeśli wrócimy do naszego pierwszego przykładu, oto co się dzieje:

(1..20) === capacity(21..70) === capacity(71..100) === capacity

Jak widzisz, warunek jest odwrócony, ponieważ Ruby wywołuje === na obiekcie po lewej stronie. === jest po prostu metodą, która może być zaimplementowana przez dowolną klasę. W tym przypadku, Range implementuje tę metodę zwracając true tylko wtedy, gdy wartość znajduje się wewnątrz zakresu.

Tak oto === jest zaimplementowany w Rubiniusie (dla klasy Range):

def ===(value) include?(value)end

Źródło: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

Inną ciekawą klasą, która implementuje === jest klasa Proc.

Powiązany post: Dowiedz się więcej o procs & lambdas.

W tym przykładzie definiuję dwa procs, jeden do sprawdzenia dla even liczby, a drugi dla odd.

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

Tak naprawdę jest:

odd.===(number)even.===(number)

Użycie === w proc ma taki sam efekt jak użycie call.

Zakończenie

Dowiedziałeś się jak działa instrukcja case w Ruby i jak bardzo może być elastyczna. Teraz twoja kolej, aby zacząć jak najlepiej wykorzystywać ją w swoich własnych projektach.

Mam nadzieję, że ten artykuł był dla ciebie przydatny!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *