English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Интерпретатор 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.