Llamada por nombre de funciones Scala (call-by-name)

Scala 函数Funciones en Scala

El intérprete de Scala tiene dos formas de analizar los argumentos de función (function arguments):

  • Llamada por valor (call-by-value): primero se evalúa el valor de la expresión del argumento y luego se aplica dentro de la función;
  • Llamada por nombre (call-by-name): se aplica directamente dentro de la función la expresión del argumento sin evaluar.

Antes de entrar en la función, el modo de llamada por valor ya ha calculado el valor de la expresión del argumento, mientras que la llamada por nombre calcula el valor de la expresión del argumento dentro de la función.

Esto provoca un fenómeno: cada vez que se utiliza la llamada por nombre, el intérprete calcula el valor de la expresión una vez.

object Test {
   def main(args: Array[String]) {
        delayed(time());
   }

   def time() = {
      println("获取时间,单位为纳秒")
      System.nanoTime
   }
   def delayed( t: => Long ) = {
      println("在 delayed 方法内")
      println("参数: " + t)
      t
   }
}

En el ejemplo anterior declaramos el método `delayed`, que utiliza el símbolo `=>` entre el nombre de la variable y el tipo de variable para establecer la llamada por nombre. Al ejecutar el código anterior, la salida es la siguiente:

$ scalac Test.scala 
$ scala Test
在 delayed 方法内
获取时间,单位为纳秒
参数: 241550840475831
获取时间,单位为纳秒

En el ejemplo, el método `delay` imprime un mensaje indicando que ha entrado en el método, luego imprime el valor recibido y finalmente devuelve `t`.

Scala 函数Funciones en Scala

Otras extensiones