Scala nie ma break
lub continue
, więc pewne zachowanie w pętli wymaga nieco więcej myślenia.
Wcześniejsze zakończenie pętli wymaga rekurencji ogona, wyjątków lub scala.util.control.Breaks
(która korzysta z wyjątków).
Uzasadnieniem tego jest to, goto
że są to konstrukcje przepływowe, które zaciemniają przepływ i mogą być osiągnięte w lepszy, mniej zaskakujący sposób.
Wygląda jednak na to, że można zastosować te same argumenty return
.
Dlaczego Scala celowo pomijają break
i continue
, ale nie return
?
language-design
scala
control-structures
Paul Draper
źródło
źródło
break
icontinue
potrzebuję dodatkowych maszyn do czyszczenia. OTOHreturn
to sposób na uporządkowane zakończenie funkcji, a każda maszyna czyszcząca już tam jest.breakable { for { break; } }
tylko refleksja i prawdopodobnie daleka od skuteczności.break
icontinue
jest zawarta w swoim pytaniu w link w swoim pytaniu. Pytaniereturn
brzmi dokładnie o to, co łączyłem z pytaniem, na które udzielono odpowiedzi, przynajmniej w najczęściej głosowanej, zaakceptowanej odpowiedzi. Jeśli dwie odpowiedzi razem nie odpowiadają na twoje pytanie, być może mógłbyś edytować pytanie, aby je wyjaśnić.Odpowiedzi:
Przerwij i kontynuuj:
W rozmowie o Scali Martin Odersky podał 3 powody, dla których nie należy przerywać ani kontynuować slajdu 22:
A potem mówi: „Możemy wspierać ich wyłącznie w bibliotekach”. Na slajdzie 23 podaje kod, który implementuje
break
. Chociaż nie do końca znam Scalę wystarczająco dobrze, aby się upewnić, wygląda na to, że krótki fragment kodu na tym slajdzie jest wszystkim, co jest potrzebne do zaimplementowaniabreak
, icontinue
może być zaimplementowany w podobnie krótkim kodzie.Możliwość implementowania takich bibliotek w bibliotekach upraszcza podstawowy język.
W „Programowaniu w Scali, wydanie drugie” Martina Odersky'ego, Lexa Spoona i Billa Vennersa podano następujące wyjaśnienie:
Powrót:
Zwroty mogą być uważane za nieco imperatywne, ponieważ return jest czasownikiem, poleceniem zrobienia czegoś. Ale można je również postrzegać w sposób czysto funkcjonalny / deklaratywny: definiują one wartość zwracaną przez funkcję (nawet jeśli w funkcji z wieloma zwrotami każda z nich podaje tylko częściową definicję).
W tej samej książce mówią o
return
:Metody kończą i zwracają wartość, nawet jeśli
return
instrukcja nie jest używana, więc nie może być problemów z zamknięciami, ponieważ w przeciwnym razie zamknięcia nie zadziałałyby.Nie może być również problemu z zazębianiem się z literałami funkcji, ponieważ funkcja i tak musi zwrócić wartość.
źródło
Myślę, że poprzednie odpowiedzi oddają sprawiedliwość problemom definiowania semantyki dla
break
lubcontinue
w języku dla Scali, przy względnie nieograniczonych kontekstach.Napisałem małą bibliotekę , która definiuje
break
icontinue
bardziej ograniczonego kontekstu: iterację po sekwencji za pośrednictwem Scala-listowe. Koncentrując się na tym kontekście, uważam, że semantyka staje się jednoznaczna i łatwa do uzasadnienia.Biblioteka jest dostępna tutaj: https://github.com/erikerlandson/breakable
Oto prosty przykład tego, jak to wygląda w kodzie:
źródło