Типы параметров функций и => - PullRequest
36 голосов
/ 01 марта 2012

Что именно означает объявление параметра метода:

def myFunc(param: => Int) = param

Что означает => в верхнем определении?

Ответы [ 3 ]

56 голосов
/ 01 марта 2012

Это так называемый пароль .Это означает, что вы передаете функцию, которая должна возвращать Int, но в основном используется для реализации отложенной оценки параметров.Это похоже на:

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

Вот пример.Рассмотрим функцию answer, возвращающую некоторое значение Int:

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

И две функции, одна из которых принимает Int, а другая - Int по имени :

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

Теперь выполните их оба, используя answer:

eagerEval(answer + 2)
> answer
> eager

lazyEval(answer + 2)
> lazy
> answer

Первый случай очевиден: перед вызовом eagerEval() answer вычисляется и печатается строка "answer".Второй случай гораздо интереснее.На самом деле мы передаем функцию в lazyEval().lazyEval сначала печатает "lazy" и оценивает параметр x (фактически вызывает функцию x, переданную в качестве параметра).

См. Также

12 голосов
/ 01 марта 2012

Просто чтобы убедиться, что есть ответ, который использует правильный термин: в Спецификации языка Scala используется термин вызов по имени :

Тип параметра значения может быть предопределен =>, например х: => Т. Тип таким параметром является метод без параметров type => T. Это указывает на то, что соответствующий аргумент не оценивается в точке применения функции, но вместо этого оценивается при каждом использовании в функции. То есть аргумент оценивается с помощью по имени .

- Раздел 4.6.1 Спецификация языка Scala

7 голосов
/ 18 сентября 2013

Чтобы добавить ответ Томаша Нуркевича, приведенный выше, я сталкиваюсь с разницей между () => Int и => Int в том, что второе позволяет звонить с голыми блоками:

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