Typy parametrów funkcji i = >
Co dokładnie oznacza deklaracja parametru metody:
def myFunc(param: => Int) = param
Co to znaczy =>
w górnej definicji?
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ż
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 .
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
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