(Poprosiłem to pytanie już at Ruby Forum, ale nie wyciągnął żadnej odpowiedzi, więc jestem Wysyłasz go teraz)Ruby: target-less „przypadek”, w porównaniu do „if”
Od Rozumiem, następujące fragmenty kodu są równoważne pod Ruby 1.9 i nowszy:
# (1)
case
when x < y
foo
when a > b
bar
else
baz
end
# (2)
if x < y
foo
elsif a > b
bar
else
baz
end
dotychczas bym zawsze używany (2), z przyzwyczajenia. Czy ktoś mógłby pomyśleć: z konkretnego powodu, dlaczego (1) lub (2) jest "lepszy", czy jest to tylko kwestia gustu?
WYJAŚNIENIE: Niektórzy użytkownicy wyrazili zastrzeżenia, że to pytanie byłoby po prostu "oparte na opiniach", a zatem nie pasowało do tego forum. Dlatego uważam, że nie przedstawiłem się wystarczająco jasno: nie chcę rozpoczynać dyskusji na temat osobistego stylu programowania. Powód dla którego poruszyłem ten temat jest następujący:
Zaskoczyło mnie, że Ruby oferuje dwie bardzo różne składnie (bezcelową i if-elsif), ponieważ wydaje mi się, że to dokładnie ten sam cel, w szczególności, ponieważ składnia if-elsif jest tą, którą praktycznie każdy programista zna. Nie uważałbym nawet "bezcelowego za" jako "cukier syntaktyczny", ponieważ nie pozwala mi to wyrazić logiki programowania bardziej konsekwentnie niż "if-elsif".
Zastanawiam się, w jakiej sytuacji mógłbym chcieć użyć konstruktu "pozbawionego celu". Czy daje przewagę wydajności? Czy różni się od if-elsif w subtelny sposób, którego po prostu nie zauważam?
DODATKOWE ustaleń dotyczących realizacji docelowego mniej przypadku:
Olivier Poulin wskazał, że cel mniej case byłoby jawnie użyć operatora === wobec wartości „true”, co spowodowałoby (malutka) kara za "przypadek" w porównaniu do "jeśli" (i jeszcze jeden powód, dla którego nie widzę powodu, dla którego ktoś mógłby chcieć go użyć).
Jednak podczas sprawdzania dokumentacji oświadczenia o przypadkach dla Ruby 1.9 i Ruby 2.0, stwierdziłem, że opisują to inaczej, ale obie co najmniej sugerują, że === NIE może być używane w tym przypadku. W przypadku Ruby 1.9:
stwierdzenia przypadków składają się z opcjonalnego stanu, który jest w pozycji argument do wypadku i zero lub więcej, gdy klauzul. Pierwszy, gdy klauzula dopasować warunek (lub ocenę do logicznej prawdy, jeśli warunek jest null) „wygrywa”
Tu jest napisane, że jeśli warunek (czyli to, co przychodzi po „wypadku”) jest null (tj. nie istnieje), pierwsza klauzula "when", która jest prawdziwa, to ta, która jest wykonywana. Brak odniesienia do === tutaj.
W Ruby 2.0 sformułowanie jest zupełnie inna:
Sprawa wyrażenie może być używany na dwa sposoby. Najpopularniejszym sposobem jest porównywanie obiektu z wieloma wzorcami. Wzory są dopasowywane za pomocą metody + === + [.....]. Innym sposobem użycia wyrażenia case jest jak wyrażenie if-elsif: [przykład przypadku bez celu jest podany tutaj].
Dlatego mówi, że === jest używane w "pierwszy" sposób (przypadek z celem), natomiast przypadek bez celu "jest jak" if-elsif.Tutaj nie ma wzmianki o ===.
++ za zadeklarowanie przekupu. – 7stud