Zamiast tego Ruby używa case
wyrażenia .
case x
when 1..5
"It's between 1 and 5"
when 6
"It's 6"
when "foo", "bar"
"It's either foo or bar"
when String
"You passed a string"
else
"You gave me #{x} -- I have no idea what to do with that."
end
Ruby porównuje obiekt w when
klauzuli z obiektem w case
klauzuli za pomocą ===
operatora. Na przykład 1..5 === x
i nie x === 1..5
.
Pozwala to na stosowanie wyrafinowanych when
klauzul, jak pokazano powyżej. Zakresy, klasy i wszelkiego rodzaju rzeczy mogą być testowane pod kątem nie tylko równości.
W przeciwieństwie do switch
stwierdzeń w wielu innych językach, Ruby's case
nie ma przewrotności , więc nie ma potrzeby kończenia każdego when
na break
. Możesz także określić wiele dopasowań w jednej when
klauzuli, takiej jak when "foo", "bar"
.
Głaskanie pod brodę
źródło
when
ireturn
w tym samym wierszu:when "foo" then "bar"
switch
stwierdzeń w wielu innych językach, Rubycase
NIE ma przewrotności , więc nie ma potrzeby kończenia każdegowhen
znakiembreak
.then
. Zobacz także inne odpowiedzi.case...when
zachowuje się nieco nieoczekiwanie podczas obsługi klas. Wynika to z faktu, że korzysta on z===
operatora.Ten operator działa zgodnie z oczekiwaniami z literałami, ale nie z klasami:
Oznacza to, że jeśli chcesz wykonać
case ... when
ponad klasę obiektu, to nie zadziała:Wypisuje „To nie jest ciąg ani liczba”.
Na szczęście można to łatwo rozwiązać.
===
Operator został zdefiniowany tak, że wracatrue
, jeśli używasz go z klasy i dostarczamy instancji tej klasy jako drugiego argumentu:Krótko mówiąc, powyższy kod można naprawić, usuwając
.class
:Znalazłem ten problem dzisiaj, szukając odpowiedzi, i to była pierwsza strona, więc pomyślałem, że przyda się innym w tej samej sytuacji.
źródło
.class
udział w Interesujący jest fakt, dzięki. Oczywiście, jest to całkowicie właściwe zachowanie (chociaż mogłem zobaczyć, jak często może się zdarzyć, że to się wydrukujeIt is a string
) ... testujesz klasę dowolnego obiektu, a nie samego obiektu. Tak więc, na przykład:case 'hello'.class when String then "String!" when Class then "Class!" else "Something else" end
wyniki w:"Class!"
To działa tak samo na1.class
,{}.class
itp spada.class
, mamy"String!"
lub"Something else"
dla tych różnych wartościach.Odbywa się to za pomocą
case
Ruby. Zobacz także „ Oświadczenie o zmianie” na Wikipedii.Zacytowany:
Inny przykład:
Na stronie 123 The Ruby Programming Language (1st Edition, O'Reilly) na moim Kindle, napisano, że
then
słowo kluczowe powhen
klauzulach można zastąpić znakiem nowej linii lub średnikiem (tak jak wif then else
składni). (Ruby 1.8 zezwala również na dwukropek zamiastthen
, ale ta składnia nie jest już dozwolona w Ruby 1.9.)źródło
when (-1.0/0.0)..-1 then "Epic fail"
type = #{score}
każdą linię, mogę po prostu skopiować to, co zrobiłeś. O wiele bardziej elegancki Lubię teżskrzynia ... kiedy
Aby dodać więcej przykładów do odpowiedzi Chucka :
Z parametrem:
Bez parametru:
Należy pamiętać o „ Jak napisać instrukcję zmiany w Ruby ”, o której ostrzega kikito.
źródło
or
Wiele języków programowania, zwłaszcza tych pochodzących z C, obsługuje tak zwany Switch Fallthrough . Szukałem najlepszego sposobu, aby zrobić to samo w Ruby i pomyślałem, że może być przydatny dla innych:
W językach podobnych do C przegląd zwykle wygląda następująco:
W Ruby to samo można osiągnąć w następujący sposób:
Nie jest to ściśle równoważne, ponieważ nie jest możliwe
'a'
wykonanie bloku kodu przed wpadnięciem do'b'
lub'c'
, ale w przeważającej części uważam, że jest wystarczająco podobny, aby był użyteczny w ten sam sposób.źródło
W Ruby 2.0 możesz również używać lambd w
case
instrukcjach, w następujący sposób:Możesz także łatwo tworzyć własne komparatory za pomocą Struct z niestandardowym
===
(Przykład wzięty z „ Czy można używać procs z instrukcjami case w Ruby 2.0? ”.)
Lub z pełną klasą:
(Przykład zaczerpnięty z „ Jak działa instrukcja Ruby Case i co możesz z tym zrobić ”).
źródło
Możesz użyć wyrażeń regularnych, takich jak znalezienie typu ciągu:
Ruby
case
użyje===
do tego operandu równości (dzięki @JimDeville). Dodatkowe informacje są dostępne w „ Ruby Operators ”. Można to również zrobić na przykładzie @mmdemirbas (bez parametru), tylko takie podejście jest czystsze dla tego typu przypadków.źródło
Jeśli chcesz wiedzieć, jak używać warunku OR w obudowie przełącznika Ruby:
Tak więc, w
case
zestawieniu, na,
to odpowiednik||
wif
oświadczeniu.Zobacz „ Jak działa instrukcja Ruby Case i co możesz z tym zrobić ”.
źródło
Nazywa się
case
i działa tak, jak można się spodziewać, a także o wiele więcej zabawy dzięki uprzejmości,===
która implementuje testy.Teraz trochę zabawy:
Okazuje się, że możesz również zastąpić dowolny łańcuch if / else (to znaczy nawet jeśli testy nie obejmują wspólnej zmiennej)
case
, pomijająccase
parametr początkowy i zapisując wyrażenia, w których pierwsze dopasowanie jest tym, czego chcesz.źródło
Ruby używa
case
do pisania instrukcji switch.Zgodnie z
case
dokumentacją:Przykład:
Krótsza wersja:
A jako „ Deklaracja przypadku Ruby - zaawansowane techniki ” opisuje Ruby
case
;Może być używany z zakresami :
Może być stosowany z Regex :
Może być stosowany z Procs i Lambdas :
Ponadto można go używać z własnymi klasami meczów:
źródło
W zależności od przypadku możesz użyć skrótu metod.
Jeśli istnieje długa lista
when
s, a każda z nich ma konkretną wartość do porównania (nie interwał), skuteczniej będzie zadeklarować skrót metod, a następnie wywołać odpowiednią metodę z takiego skrótu.źródło
Ponieważ
switch case
zawsze zwraca pojedynczy obiekt, możemy bezpośrednio wydrukować jego wynik:źródło
Przypadek wielowartościowy, gdy i bez wartości:
I tutaj rozwiązanie wyrażeń regularnych :
źródło
case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end
(gdzie,
oznacza nowy wiersz)W
case
Ruby możesz pisać wyrażenia na dwa różne sposoby:if
stwierdzeńcase
a każdawhen
klauzula jest porównywana z celem.lub:
źródło
Możesz to zrobić w bardziej naturalny sposób,
źródło
Wiele świetnych odpowiedzi, ale pomyślałem, że dodam jeden faktoid. Jeśli próbujesz porównać obiekty (klasy), upewnij się, że masz metodę statku kosmicznego (nie żart) lub zrozum, jak są porównywane
„ Ruby Equality And Object Porównanie ” to dobra dyskusja na ten temat.
źródło
<=>
jest używana do zwracania wartości -1, 0, 1 lub zero w zależności od tego, czy porównanie zwraca odpowiednio mniej niż, równość, więcej niż lub nieporównywalnie. Wyjaśnia to dokumentacja modułu Ruby Porównywalna .Jak stwierdzono w wielu powyższych odpowiedziach,
===
operator jest używany pod maskącase
/when
instrukcji.Oto dodatkowe informacje o tym operatorze:
Operator równości przypadków:
===
Wiele wbudowanych klas Ruby, takich jak String, Range i Regexp, zapewnia własne implementacje
===
operatora, znanego również jako „równość wielkości liter”, „trzykrotnie równe” lub „trzykwale”. Ponieważ jest zaimplementowany inaczej w każdej klasie, będzie zachowywać się inaczej w zależności od typu obiektu, do którego został wywołany. Zasadniczo zwraca wartość true, jeśli obiekt po prawej „należy do” lub „jest członkiem” obiektu po lewej stronie. Na przykład można go użyć do przetestowania, czy obiekt jest instancją klasy (lub jednej z jego podklas).Ten sam wynik można osiągnąć za pomocą innych metod, które prawdopodobnie najlepiej nadają się do pracy, takich jak
is_a?
iinstance_of?
.Zakres realizacji
===
Gdy
===
operator jest wywoływany na obiekcie zakresu, zwraca wartość true, jeśli wartość po prawej stronie mieści się w zakresie po lewej stronie.Pamiętaj, że
===
operator wywołuje===
metodę obiektu po lewej stronie. Więc(1..4) === 3
jest równoważna(1..4).=== 3
. Innymi słowy, klasa operandu po lewej stronie określi, która implementacja===
metody zostanie wywołana, więc pozycje operandu nie są wymienne.Wdrożenie Regexp
===
Zwraca true, jeśli ciąg po prawej stronie pasuje do wyrażenia regularnego po lewej.
Jedyną istotną różnicą między dwoma powyższymi przykładami jest to, że gdy występuje dopasowanie,
===
zwraca true i=~
zwraca liczbę całkowitą, która jest prawdą w Rubim. Wrócimy do tego wkrótce.źródło
źródło
Aby uzyskać więcej informacji, zobacz „ Ruby - jeśli ... w innym przypadku, chyba że ”.
źródło
Zacząłem używać:
W niektórych przypadkach pomaga to w kompaktowaniu kodu.
źródło
Hash
pomocącase
instrukcji , a nie instrukcji.Brak obsługi wyrażeń regularnych w twoim środowisku? Np. Shopify Script Editor (kwiecień, 2018):
Obejście po kombinacji metod już wcześniej omawianych tutaj i tutaj :
Użyłem
or
s w instrukcji metody class, ponieważ||
ma wyższy priorytet niż.include?
. Jeśli jesteś rubinowym nazistą , wyobraź sobie, że użyłem tego(item.include? 'A') || ...
zamiast tego . test repl.it.źródło
Bardzo ważne jest podkreślenie przecinka (
,
) wwhen
zdaniu. Działa jako||
oif
oświadczeniu, to znaczy, że robi LUB porównania, a nie I Porównanie ustalonych wyrażeńwhen
klauzuli. Zobacz następującą instrukcję przypadku:x
jest nie mniejsza niż 2, ale zwracana jest wartość"apple"
. Dlaczego? Ponieważx
było 3, a od',`` acts as an
||, it did not bother to evaluate the expression
x <2 '.Możesz pomyśleć, że aby wykonać operację AND , możesz zrobić coś takiego poniżej, ale to nie działa:
Nie działa, ponieważ
(3 && x > 2)
zwraca wartość true, a Ruby przyjmuje wartość True i porównuje jąx
z===
, co nie jest prawdą, ponieważx
wynosi 3.Aby dokonać
&&
porównania, będziesz musiał traktowaćcase
jakif
/else
block:W książce Ruby Programming Language Matz mówi, że ta ostatnia forma jest prostą (i rzadko używaną) formą, która jest niczym innym jak alternatywną składnią dla
if
/elsif
/else
. Jednak niezależnie od tego, czy jest to rzadko używane, czy nie, nie widzę innego sposobu na dołączenie wielu&&
wyrażeń dla danejwhen
klauzuli.źródło
if...elsif
? Wygląda na to, że próbujesz połączyć instrukcję przypadku i warunek. Dlaczego? Wystarczy umieścić warunek wewnątrz bloku when, np.when 3; ( x < 2 ) ? 'apple' : 'orange'
Możemy napisać instrukcję switch dla wielu warunków.
Na przykład,
źródło
case
,when
,end
) Są wrażliwe na wielkość liter i nie może być tak wielka.NoMethodError (undefined method
CASE 'dla main: Object) `. Jak powiedział @ sondra.kinsey, nie można używać wielkich liter. Ruby pomyśli, że to STAŁA.case
Operator stwierdzenie jest jakswitch
w innych językach.Oto składnia
switch...case
w C:Oto składnia
case...when
w Ruby:Na przykład:
Aby uzyskać więcej informacji, zobacz
case
dokumentację.źródło