Scala: вызов функции по имени (call-by-name)

Scala 函数Функции Scala

Интерпретатор 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 函数Функции Scala

Другие расширения