Что именно это объявление параметра метода означает:
def myFunc(param: => Int) = param
Что означает =>
в верхнем определении?
Что именно это объявление параметра метода означает:
def myFunc(param: => Int) = param
Что означает =>
в верхнем определении?
Это так называемый 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
, переданную как параметр).
Просто чтобы убедиться, что есть ответ, который использует правильный термин: Scala Спецификация языка использует термин call-by-name:
Тип параметра значения может быть предварительно задан = > , например. x: = > T. Тип таким параметром является беспараметрический метод type = > T. Это указывает на то, что соответствующий аргумент не оценивается в точке приложения функции, но вместо этого оценивается при каждом использовании внутри функции. То есть, аргумент оценивается с помощью вызова по имени.
- Раздел 4.6.1 Scala Спецификация языка
Чтобы добавить к 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