2011-08-29 11 views

Odpowiedz

10

Oznacza to blok kodu, który można uruchomić.

Tak na przykład:

scala> def doTwice(op: =>Unit) = {op; op} 
doTwice: (op: => Unit)Unit 

scala> doTwice({println("Hi")}) 
Hi 
Hi 

W tym przypadku =>Unit jest {println("Hi")}

Here "SomeType" to jednostka ponieważ println nie wytwarza wartości. Jeśli wyprodukowałby ona kod Int, byłby to =>Int.

+1

Oooh, rozumiem. Dzięki! Tego nienawidzę w scala. To jest absurdalnie trudne do takich rzeczy w Google :) Dziękuję Bogu za dobrych ludzi i stackoverflow :) – Arg

+4

Dobry przykład. W tym przypadku parametr 'op' jest nazywany parametrem * call by name * (w przeciwieństwie do * według wartości *). Zauważ, że równie dobrze byłoby pisać 'doTwice (println (" Hi "))'. Kiedy wywołujesz funkcję w Scali, składnia nie wskazuje, czy przekazujesz parametr przez * name * lub przez * value *. –

+2

@Arg [SymbolHound] (http://symbolhound.com/) jest twoim przyjacielem. –

2

To tylko typ wartości funkcji, która nie przyjmuje parametrów. Przykład Owena jest fajny, po prostu wiedz, że "A => B" jest funkcją z parametrem, który ma typ A, a wartość powrotu z typem B i "=> B" jest funkcją, która nie przyjmuje parametrów i zwraca wartość z typem B.

6

Wskazuje dwie rzeczy. Po pierwsze, z powodu prefiksu =>, wskazuje on, że parametr zostanie przekazany by name. Następnie wskazuje, że typ przekazywanego parametru musi być SomeType.

Niektórzy ludzie łączą oba, myśląc, że => SomeType jest typem - nie jest. Jest to połączenie dwóch rzeczy: strategii oceny parametrów i typu parametru.

Więc krótkie wyjaśnienie na wezwanie przez nazwę, w przypadku łącza wikipedia nie było jasne, czy masz to:

def f[A](x: => A) = { x; x } 
f(some stuff) 

Potem Scala będzie wykonywał to tak:

{ some stuff; some stuff } 

na rozmowy przez wartość, co się dzieje, jest więcej tak:

val x = some stuff 
{ x; x } 

Należy również zauważyć, że parametr jest zawsze oceniane na wywołanie według wartości, ale tylko raz. Podczas wywoływania według nazwy parametr może być oceniany (jeśli nie znajduje się na gałęzi if), ale może być oceniany wiele razy.

+1

co reprezentuje [A] w tym przypadku? widziałem go w wielu miejscach, ale nadal go nie rozumiem. –

+1

@elimence Jest to parametr _type_. Jest to typ, który nie jest znany w momencie, gdy deklarowane jest 'f', ale będzie znane w punkcie' f'. Funkcja 'f' jest poprawna dla wszystkich typów' A', aw tym przypadku nie ma ograniczeń co do tego, czym może być "A".Mogłem użyć 'A <: SomeConcreteType' do wskazania dolnej granicy (' A' musi być 'SomeConcreteType' lub podtypem tego),' A>: SomeOtherType' ('A' musi być superklasą' SomeOtherType') , a także wskazanie "A" musi być częścią jakiegoś niejawnego parametru, co prowadzi do arbitralnych ograniczeń tego, czym może być "A". –

+0

Dziękuję Danielu, mam to teraz –