2014-10-14 11 views
6

Jestem nowy w scala, ale mam tło w javascript.Dlaczego Scala potrzebuje oświadczenia def?

Podczas gdy widzę potrzebę oddzielenia między val i var (zmienne i niezmienne), nie widzę powodu, dla którego instrukcja def była kiedykolwiek potrzebna.

Jeśli funkcje są prawdziwie pierwszorzędnymi obywatelami, tak jak w javascript, dlaczego powinny być zadeklarowane z def, a nie z val?

jest to, że decyzji projektowych w oparciu o ograniczeniach związanych z JVM, czy istnieje jakaś logika, że ​​nie udało mi się zrozumieć?

+1

@ 0__ niezupełnie dupe: na pytanie * dlaczego został zaprojektowany w ten sposób *, nie * jaka jest różnica * –

+4

@ om-nom-nom: OP pyta, dlaczego funkcje są zadeklarowane z 'def', ale funkcje nie są zadeklarowane z 'def', są deklarowane z' => ', a' def' nie deklaruje funkcji, deklaruje metody, które zasadniczo różnią się od funkcji. Całe założenie tego pytania polega na tym, że metody i funkcje są tym samym, co jest po prostu błędne i jest ładnie wyjaśnione w duplikacie pytania. –

+2

@ JörgWMittag * Całe założenie pytaniem jest to, że metody i funkcje są to samo, które jest po prostu błędne. * Ponownie, jest to * Jaka jest różnica * (innymi słowy, są one różne w rzeczywistości), ale robi nie wyjaśnia, dlaczego taka separacja została dokonana wiele lat temu. –

Odpowiedz

9

Jedna wielka ograniczenie funkcji jest to, że nie mogą one być rodzajowy jako wartość. Na przykład.

def foo[A](bar: A): Unit 

że nie może być wyrażona jako wartość funkcji

val foo: A => Unit // A is _not_ a type parameter 

który wymaga rozdzielczości typu parametru A. Inne różnice to: Metody noszą naturalne pojęcie o this jako klasie zamykającej; mogą przerwać przez return. Mogą mieć wiele list parametrów, a przede wszystkim niejawną listę parametrów. Mają nazwane i domyślne argumenty. (Próbuję sobie wyobrazić, jak mogłaby wyglądać funkcja z nazwanymi i domyślnymi argumentami, może mogłaby być zaprojektowana)

Prawdopodobnie nie byłoby niemożliwe posiadanie tylko wartości funkcji, ale def wydaje się być lepszym rozwiązaniem dla OO aspekty Scala.

+1

Najpierw należy podać podstawową różnicę ('def' służy do deklarowania * * metody, która jest zupełnie inna od deklarowania funkcji).Poza tym jest to całkiem niezła odpowiedź, więc nie rozumiem, dlaczego została ona odrzucona. – rsenna

1

myślę, że to decyzja język wykonany dla łatwiejszej migracji z Java. Zmiana sposobu działania funkcji na wartości funkcyjne jest dość duża.

4

def różni się od val i var tym, że za każdym razem, gdy odwoływana jest zmienna, jej wyrażenie jest ponownie oceniane.

+2

Dokładnie. To jest prawdziwy powód. – rsenna

+2

@rsenna Nieprawda. 'object Foo {var bar = 1234; val baz = (i: Int) => i + bar}; Foo.bar = 5678; Foo.baz (1) '. Funkcje wychwytują zakres zamknięcia tak samo jak metody. –

+2

@ 0__ wat? Nawet jeśli to, co mówisz, jest słuszne (i jest), nie ma żadnego związku z tym, co mówi ta odpowiedź. – rsenna

Powiązane problemy