tutorial recorrer parte listas lista introduccion funciones ejemplos curso comentarios scala syntax

recorrer - scala ejemplos



Scala: función de paso como bloque de código entre llaves. (1)

Algunas veces vi un código de Scala como ese:

object Doer{ def doStuff(op: => Unit) { op } }

Invocado de esta manera:

Doer.doStuff{ println("Done") }

Lo que es extraño para mí es cómo una función se pasa a otra función como un simple bloque de código entre llaves. E incluso no hay paréntesis que normalmente marcan el principio y el final de la lista de argumentos.

¿Cuál es el nombre de esta sintaxis / característica de Scala? ¿En qué casos puedo usarlo? ¿Dónde está documentado?


Esto se denomina función nula o procesador , y es un ejemplo de evaluación llamada por nombre : http://www.scala-lang.org/old/node/138

Puede utilizar nullaries prácticamente en cualquier lugar donde tenga una lista de parámetros. Básicamente, son simplemente funciones sintácticas de azúcar alrededor de cero que hacen que se vean como valores ordinarios, y se invocan siempre que se mencionan.

Asi que

def doSomething(op: => Unit) { op } doSomething { println("Hello!") }

es exactamente lo mismo que:

def doSomething(op: () => Unit) { op() } doSomething(() => println("Hello!"))

Lo único que hay que tener en cuenta con los nullaries es que se invocan cada vez que se hace referencia, por lo que algo como:

def foo(op: => Int) = op + op foo { println("foo") 5 }

imprimirá "foo" dos veces.

Edición : para ampliar el comentario de Randall, una de las grandes maneras en que una función nula difiere de la función cero-arg es que las nullaries no son valores de primera clase. Por ejemplo, puede tener una List[() => Int] pero no puede tener una List[=> Int] . Y si tuvieras algo como:

def foo(i: => Int) = List(i)

no está agregando la función de nulo a la lista, solo su valor de retorno.