Scala: вызов функции по имени (call-by-name)
Интерпретатор Scala имеет два способа разбора аргументов функции:
- Вызов по значению: сначала вычисляется значение выражения параметра, затем оно применяется внутри функции;
- Вызов по имени: непосредственно применяется невычисленное выражение параметра внутри функции
Перед входом в функцию подход с вызовом по значению уже завершил вычисление выражения параметра, тогда как вызов по имени вычисляет выражение параметра внутри функции.
Это приводит к следующему явлению: при каждом использовании вызова по имени интерпретатор вычисляет выражение один раз.
object Test {
def main(args: Array[String]) {
delayed(time());
}
def time() = {
println("获取时间,单位为纳秒")
System.nanoTime
}
def delayed( t: => Long ) = {
println("在 delayed 方法内")
println("参数: " + t)
t
}
}
В приведённом выше примере мы объявили метод delayed, который использует символ => между именем переменной и типом переменной для настройки вызова по имени. Выполнение приведённого выше кода даёт следующий вывод:
$ scalac Test.scala $ scala Test 在 delayed 方法内 获取时间,单位为纳秒 参数: 241550840475831 获取时间,单位为纳秒
В примере метод delay выводит сообщение о том, что он вошёл в метод, затем метод delay выводит полученное значение и в конце возвращает t.
Другие расширения
Функции Scala