Tour of Scala

Вызов по имени

Language

Вызов параметров по имени - это когда значение параметра вычисляется только в момент вызова параметра. Этот способ противоположен вызову по значению. Чтоб вызов параметра был по имени, необходимо просто указать => перед его типом.

def calculate(input: => Int) = input * 37

Преимущество вызова параметров по имени заключается в том, что они не вычисляются если не используются в теле функции. С другой стороны плюсы вызова параметров по значению в том, что они вычисляются только один раз.

Вот пример того, как мы можем реализовать условный цикл:

def whileLoop(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    whileLoop(condition)(body)
  }

var i = 2

whileLoop (i > 0) {
  println(i)
  i -= 1
}  // выведет 2 1
def whileLoop(condition: => Boolean)(body: => Unit): Unit =
  if condition then
    body
    whileLoop(condition)(body)

var i = 2

whileLoop (i > 0) {
  println(i)
  i -= 1
}  // выведет 2 1

Метод whileLoop использует несколько списков параметров - условие и тело цикла. Если condition является верным, выполняется body, а затем выполняется рекурсивный вызов whileLoop. Если condition является ложным, то тело никогда не вычисляется, тк у нас стоит => перед типом body.

Теперь, когда мы передаем i > 0 как наше условие condition и println(i); i-= 1 как тело body, код ведет себя также как обычный цикл в большинстве языков программирования.

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

Contributors to this page: