O ile rozumiem, w Scali możemy zdefiniować funkcję bez parametrów albo za pomocą pustych nawiasów po nazwie, albo bez nawiasów, a te dwie definicje nie są synonimami. Jaki jest cel rozróżniania tych dwóch składni i kiedy powinienem lepiej użyć jednego zamiast drugiego?Dlaczego używać pustych nawiasów w Scali, jeśli nie możemy użyć nawiasów w celu zdefiniowania funkcji, która nie wymaga żadnych argumentów?
Odpowiedz
To głównie kwestia konwencji. Metody z pustymi listami parametrów są, zgodnie z przyjętą konwencją, oceniane pod kątem ich skutków ubocznych. Przyjmuje się, że metody bez parametrów są wolne od skutków ubocznych. To jest konwencja.
Scala Style Guide mówi pominąć nawiasy tylko wtedy, gdy metoda jest nazywana ma skutki uboczne: http://docs.scala-lang.org/style/method-invocation.html
Inne odpowiedzi są świetne, ale ja również uważam, że warto wspomnieć, że metody nie-param pozwalają na miły dostępu do klas pól, tak jak poniżej:
person.name
Ponieważ metod bez parametrów, można łatwo napisać metodę do przechwycenia czyta (lub pisze) w polu „nazwa” bez łamania kodu dzwoni, tak jak
def name = { log("Accessing name!"); _name }
To się nazywa Uniform Access Principal
mam innego światła do doprowadzenia do przydatności konwencji wspierania pustych nawiasów zablokować w deklaracji funkcji (a zatem w dalszej części rozmowy do nich) z efektami ubocznymi.
Jest z debugerem.
Jeśli ktoś doda zegarek do debuggera, na przykład process
, odwołując się do przykładu do wartości logicznej w kontekście szczegółowym debugowania, albo jako widok zmienny, albo jako czysta funkcja oceny efektów ubocznych, to stwarza nieprzyjemne ryzyko dla późniejszego rozwiązywania problemów. Rzeczywiście, jeśli debugger utrzymuje ten zegarek jako próbę oceny sytuacji za każdym razem, gdy zmieniasz kontekst (zmieniaj wątek, poruszaj się w stosie wywołań, osiągaj inny punkt przerwania ...), co okazało się co najmniej w przypadku IntelliJ IDEA, lub Visual Studio dla innych języków, wówczas będą wywoływane efekty uboczne dowolnej innej funkcji wyświetlanej w dowolnym przeglądzie zakresu ...
Proszę sobie wyobrazić rodzaj zagadkowego rozwiązywania problemów, które mogłoby prowadzić do tego, nie mam tego ostrzeżenia z powodu jakiejś niewinnej zwykłej nazwy. Jeśli konwencja została wymuszona, z moim przykładem, ocena boolowska process
nigdy nie powróciłaby do funkcji process()
w zegarkach debuggera; może być po prostu dozwolone w twoim debugerze jawny dostęp do funkcji() umieszczając process()
w zegarkach, ale wtedy jasne jest, że nie uzyskujesz bezpośredniego dostępu do żadnego atrybutu lub zmiennych lokalnych, ani też nie zastępujesz innych funkcji process()
w innych przeglądanych zakresach, jeśli może pechowy, w każdym razie będzie mniej zaskakujący.
- 1. Dlaczego "typof" nie potrzebuje nawiasów?
- 2. Dlaczego Lambda Java, która zgłasza wyjątek Runtime, wymaga nawiasów?
- 3. Czy mogę użyć nawiasów klamrowych w Ruby, jeśli/else?
- 4. Dlaczego numpy.r_ zamiast nawiasów używa nawiasów?
- 5. Dlaczego nie można użyć funkcji lambda do zdefiniowania funkcji prototypowej?
- 6. Dlaczego C# wymaga nawiasów przy użyciu nullables w wyrażeniu?
- 7. Tworzenie instancji PHP. Aby użyć lub nie użyć nawiasów?
- 8. Dlaczego kompilator C++ nie narzeka, gdy używam funkcji bez nawiasów?
- 9. Nie można użyć nawiasów Dzwoniąc Sub błąd 800A0414 VBS
- 10. Kiedy należy używać nawiasów w nokautach
- 11. Dlaczego korzystanie z funkcji bez nawiasów w produkcji jest złe?
- 12. Jak używać podwójnych nawiasów w wyrażeniu regularnym?
- 13. Definiowanie bryły funkcji bash za pomocą nawiasów zamiast nawiasów klamrowych
- 14. Wywołanie funkcji w instrukcji if bez nawiasów
- 15. Ucieczka nawiasów klamrowych w props.children
- 16. `exit` wewnątrz nawiasów nie wychodzi ze skryptu
- 17. Jak uniknąć nawiasów w grep
- 18. Co to jest funkcja, która nie wywołuje żadnych argumentów?
- 19. Podświetlanie nawiasów w Textmate (javascript)
- 20. Regex dla nawiasów prostokątnych w R
- 21. Nie można wyłączyć autouzupełniania nawiasów metod w Eclipse
- 22. Jak używać nawiasów kwadratowych jako postać cytując w Pandas.read_csv
- 23. PHP Jeśli instrukcje/Else bez nawiasów
- 24. Kiedy należy używać nawiasów w instrukcjach require/include?
- 25. Usuwanie nawiasów ze stringa
- 26. Dlaczego nie mogę użyć `import *` w funkcji?
- 27. nawiasów klamrowych w Arrow Funkcje
- 28. W clojure, dlaczego assoc wymaga argumentów oprócz mapy, ale nie dissoc nie?
- 29. Dlaczego nie możemy użyć dispatch_sync w bieżącej kolejce?
- 30. Dwa zestawy nawiasów po wywołaniu funkcji
Co byś zrobił dla metody fabryki? Czy napiszesz "def createAccount: Account" lub "def createAccount(): Account"? – David
Dla w pełni idiomatycznej Scali, metody fabryczne są zazwyczaj zapisywane na obiekcie towarzyszącym i mają nazwę "zastosuj". Następnie możesz tworzyć obiekty ze specjalną składnią do zastosowania: Konto (args). –
Kompilator akceptuje nadpisujące definicje niezależnie od pustych list parametrów: http://pastie.org/1204728. Poszukaj łańcucha "pusta lista parametrów" w specyfikacji języka. – mkneissl