Подтвердить что ты не робот

Типы параметров функции и =>

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

def myFunc(param: => Int) = param

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

4b9b3361

Ответ 1

Это так называемый pass-by-name. Это означает, что вы передаете функцию, которая должна возвращать 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, переданную как параметр).

См. также

Ответ 2

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

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

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

Ответ 3

Чтобы добавить к Tomasz Nurkiewicz ответ выше, разница, с которой я сталкиваюсь между() = > 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