Typy parametrów funkcji i = >

Co dokładnie oznacza deklaracja parametru metody:

def myFunc(param: => Int) = param

Co to znaczy => w górnej definicji?

Author: PrimosK, 2012-03-01

3 answers

Jest to tzw. pass-by-name . Oznacza to, że przekazujesz funkcję, która powinna zwrócić Int, ale jest ona najczęściej używana do implementacji leniwej oceny parametrów. Jest nieco podobny do:

def myFunc(param: () => Int) = param

Oto przykład. Rozważmy funkcję answer zwracającą pewną Int wartość:

def answer = { println("answer"); 40 }

I dwie funkcje, jedna przyjmująca Int i jedna przyjmująca Int by-name :

def eagerEval(x: Int)   = { println("eager"); x; }
def lazyEval(x: => Int) = { println("lazy");  x; }

Teraz wykonaj oba z nich używając answer:

eagerEval(answer + 2)
> answer
> eager

lazyEval(answer + 2)
> lazy
> answer

Pierwszy przypadek to oczywiste: zanim zadzwonisz eagerEval() answer jest oceniany i wypisuje "answer" string. Drugi przypadek jest o wiele bardziej interesujący. W rzeczywistości przekazujemy funkcję lazyEval(). lazyEval najpierw wyświetla "lazy" i ocenia parametr x (w rzeczywistości wywołuje funkcję x przekazaną jako parametr).

Zobacz też

 55
Author: Tomasz Nurkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 15:30:01

Aby upewnić się, że istnieje odpowiedź, która używa właściwego terminu: specyfikacja języka Scala używa terminu call-by-name :

Typ parametru wartości może być poprzedzony przez=>, np. x: = > T . Rodzaj takim parametrem jest wtedy metoda bez parametru typ = > T . Oznacza to, że odpowiedni argument nie jest oceniany w punkcie aplikacji funkcji, ale zamiast tego jest oceniana przy każdym użyciu w ramach funkcji. Czyli argument jest oceniany za pomocą call-by-name .

-- sekcja 4.6.1 specyfikacji języka Scala

 11
Author: Wilfred Springer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 07:18:00

Aby dodać do powyższej odpowiedzi Tomasza Nurkiewicza, różnica, którą napotkam między () = > Int i = > Int jest taka, że druga pozwala na wywołanie z gołymi blokami:

scala> def myfunc(f : () => Int ) = println("Evaluated: " + f )
myfunc: (f: () => Int)Unit

scala> def myfunc2(f : => Int ) = println("Evaluated: " + f )
myfunc2: (f: => Int)Unit

scala> myfunc({1})
<console>:9: error: type mismatch;
 found   : Int(1)
 required: () => Int
              myfunc({1})
                  ^

scala> myfunc2({1})
Evaluated: 1
 6
Author: mo-seph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 15:03:07