English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Вызов функции в Scala

Функции Scala

Интерпретатор Scala имеет два способа анализа параметров функции (function arguments):

  • Передача по значению (call-by-value): Сначала вычисляется значение выражения параметра, а затем оно применяется внутри функции;

  • Передача по имени (call-by-name): Прямое применение не вычисленного выражения параметра внутри функции

Перед входом в функцию способ передачи по значению уже вычисляет значение выражения параметра, в то время как передача по имени вычисляет значение выражения параметра внутри функции.

Это создает явление, при каждом использовании передачи по имени интерпретатор вычисляет значение выражения один раз.

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