Właśnie myślałem o czymś, co byłoby naprawdę fajne w moich kontrolach if-elif-else.
if condition:
stuff()
elif condition:
otherstuff()
then:
stuff_that_applies_to_both()
else:
stuff_that_doesnt_aply_to_either()
Zasadniczo a then
zostanie uruchomione, gdy którykolwiek z warunków zostanie uruchomiony Z WYJĄTKIEM warunku else. Czy uważasz, że to jest przydatne? Jest podobny do try-wyjątkiem-else Pythona.
Myślę, że niektórzy z was robią bardzo wstępne wdrożenie. then
Blok byłby podobnie jak else
bloku w try-except
bloku w Pythonie. Prawdziwy powód, dla którego to sugeruję, dotyczy takich sytuacji.
m = {}
if condition == '1':
m['condition'] = condition
elif condition2 == '3':
m['condition2'] = condition2
elif condition3 == 'False':
m['condition3'] = True
then:
run_test_that_relies_on_one_of_the_conditions_being_true()
return m
then
Blok jest zawężona do pierwszego, czy podobnie jak else
jest. Tak więc zagnieżdżanie działa dobrze. A jeśli musisz uruchomić metodę przed instrukcjami if, to tak naprawdę nie ma to nic wspólnego z tym przypadkiem użycia.
finally
w Javie?then
trochę zagmatwany. Zazwyczajthen
zakłada się, że nastąpi poif
. To znaczy, mówisz,if condition, then stuff()
ale potem kontynuujthen stuff that applies to both
Odpowiedzi:
Myślę, że to wygląda okropnie. Jeśli chcesz, aby kod działał po wielu różnych warunkach, albo (a) ponownie sprawdź te warunki lub (b) ustaw zmienną wskazującą status powodzenia.
źródło
Zasadniczo możesz już to zrobić za pomocą przełącznika / skrzynki, a przełącznik / obudowa zapewnia bardziej precyzyjną kontrolę nad tym, co proponujesz.
Nie odczytuje również poprawnie logicznie. Jeśli A, jeśli B, to C, to nie oznacza, że C zostanie wykonane, jeśli A lub B zostaną ocenione jako prawdziwe.
źródło
Interesujące, ale wydaje mi się (co prawda nieco na mój sposób ustawione) zaproszenie do czytelności, logiki i problemów ze składnią.
Edycja:
Twój if-elif jest bardzo prosty - a gdyby było 10 elifów? 20? Czy wszystkie warunki musiałyby być spełnione? Jakie są szanse na to?Twój if-elif jest bardzo prosty - a gdyby było 10 elifów? 20? Czy to nie czyni tego dość nieczytelnym?
Ponadto można to łatwo osiągnąć, sprawdzoną metodologią:
Co się stanie, jeśli „stuff_that_applies_to_both” musi zdarzyć się przed poszczególnymi krokami? Twój kod nie obsługuje tego przypadku:
Wreszcie, ta składnia pozwala na większą elastyczność przy większej liczbie warunków: if (thisCondition or thatCondition or anotherCondition) {stuff_that_applies_to_all ();
Korzystałem z if / else, ale równie łatwo mogłem użyć instrukcji switch z flagą:
Zauważ, że tak naprawdę nie potrzebowałem flagi conditionApplies - mogłem dodać funkcję „stuff_that_applies_to_both ()” do obu warunków innych niż domyślne - właśnie to zrobiłem, aby wyglądało bardziej jak zdefiniowana powyżej składnia, aczkolwiek „wtedy” zamiast „else”.
Dlatego wydaje mi się, że jest to bardzo wyspecjalizowana składnia, w której bardziej ogólna składnia wypełnia rachunek i więcej.
+1 za myślenie o możliwej funkcji (rób to!), Ale nie głosowałbym na jej wdrożenie.
źródło
what if there were 10 elifs? 20? Would all conditions need to be true?
To nie jest możliwe. tylko 1 elif może być prawdziwy, ponieważ przestaje oceniać więcej.Dzisiaj nie miałbym nic przeciwko użyciu czegoś takiego. Ale, dla pewności, używałbym tego tak często, jak powtarzam do.
Kod przynajmniej wyglądałby lepiej bez zbędnego zagnieżdżania. Chociaż wolę
Else If
doelif
. Chciałbym wymienićThen
zDo
a ostatecznaElse
zOtherwise
.źródło
To wydaje się fajnym pomysłem. Jednak jedynym problemem, jaki sobie wyobrażam, jest to, że jesteś bardziej podatny na błędy. Jak napisanie if / else if i wywołanie blaha () w tym czasie. Napisanie dodatkowego, jeśli to nie chce bla, usunięcie bla z tego i dodanie go do ifs / elseifs. Następnie, gdy ty lub inny programista dodasz inną instrukcję, możesz oczekiwać, że zadzwoni bla, ale nie.
Lub możesz mieć kilka ifs, napisać bla i zapomnieć o wszystkich ifs, ale jeden wymaga tego, co by coś zepsuło. Są również szanse, jeśli będziesz ich przestrzegać, jeśli umieścisz ją pod blokiem if. Możliwe ustawienie bool w else (NoUpdate = true) i po prostu napisz bezpośrednio if (! NoUpdate) {}, pod którym jest jaśniejsze i może być ustawione przez if
Mówię tylko, że wydaje się bardziej podatny na błędy, nie że nie podoba mi się ten pomysł. Nie miałbym nic przeciwko widzeniu go w języku, ale nie wyobrażam sobie żadnego situtaion, w którym mógłbym go użyć, jeśli mój język to obsługuje.
źródło
Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an if
Jest to DOKŁADNIE to, co ma temu zapobiec. To jest sedno oświadczenia elif. Elif też nie jest konieczny, można to sprawdzić za pomocą instrukcji if, ale komplikuje się.Uważam twoją składnię za mylącą, ale widzę w niej pewną wartość. Koncepcyjnie, kiedy zastanawiałem się nad tym problemem, zauważyłem, że „unelse”, który w zasadzie działałby w przypadkach, gdy ostatni
else
nie strzelał. Patrząc na to z tej perspektywy, sugerowałbym, że można osiągnąć podobny wynik poprzez:Inną opcją może być w niektórych przypadkach:
Trochę nieprzyjemnie wyglądający, ale w niektórych przypadkach może nie być żadnego dobrego sposobu wyrażenia pożądanej sekwencji zdarzeń poza kopiowaniem kodu lub używaniem
goto
(co może nie być takie złe, z wyjątkiem kreskówki, którą ktoś mógłby tu wstawić).źródło