2010-10-07 14 views

Odpowiedz

31

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.

+0

Co byś zrobił dla metody fabryki? Czy napiszesz "def createAccount: Account" lub "def createAccount(): Account"? – David

+5

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). –

+0

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

1

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

+0

To jest przeznaczone do pracy przy ustawianiu właściwości także?? – Ivan

+0

mój przykład był dla uzyskania, tutaj ustawienie def nazwa _ = (nazwa: String) = {_name = nazwa} –

+0

Tak, używam tego. Ale zastanawiam się, czy to znaczy "name_ =" lub "name _ ="? – Ivan

0

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.

Powiązane problemy