¿Qué es exactamente que la declaración de parámetro del método significa:tipos de parámetros de función y =>
def myFunc(param: => Int) = param
¿Cuál es el significado de =>
en la definición superior?
¿Qué es exactamente que la declaración de parámetro del método significa:tipos de parámetros de función y =>
def myFunc(param: => Int) = param
¿Cuál es el significado de =>
en la definición superior?
Esto se denomina pass-name. Significa que está pasando una función que debería devolver Int
, pero se usa principalmente para implementar la evaluación diferida de los parámetros. Es algo similar a:
def myFunc(param:() => Int) = param
Aquí hay un ejemplo. Considere una función answer
regresar algún Int
valor:
def answer = { println("answer"); 40 }
Y dos funciones, una toma Int
y uno teniendo Int
por nombre:
def eagerEval(x: Int) = { println("eager"); x; }
def lazyEval(x: => Int) = { println("lazy"); x; }
Ahora ejecutar ambas con el uso answer
:
eagerEval(answer + 2)
> answer
> eager
lazyEval(answer + 2)
> lazy
> answer
El primer caso es obvi ous: antes de llamar a eagerEval()
answer
se evalúa e imprime "answer"
cadena. El segundo caso es mucho más interesante. En realidad estamos pasando una función al lazyEval()
. El lazyEval
imprime primero "lazy"
y evalúa el parámetro x
(en realidad, se llama a la función x
pasada como parámetro).
¡¡Gran explicación !!! +1 – PrimosK
El término que desea es "pasar por nombre", no "pasar por valor". Pasar de valor es algo bastante diferente; es lo que hace Java con los primitivos. – Destin
Creo que quieres decir "llamar por nombre", no "pasar por nombre" o "pasar por valor" (ver especificación de idioma 4.6.1) –
Sólo para asegurarse de que no es una respuesta que utiliza el término apropiado: la especificación del lenguaje Scala utiliza el término llamada por nombre:
El tipo de un parámetro de valor puede ser preajustado por =>, por ej. x: => T. El tipo de tal parámetro es entonces el método sin parámetros type => T. Esto indica que el argumento correspondiente no se evalúa en el punto de aplicación de la función, pero en su lugar se evalúa en cada uso dentro de la función. Es decir, el argumento es evaluado utilizando llamada por nombre.
- Sección 4.6.1 de la Scala Language Specification
Para añadir a la respuesta de Tomasz Nurkiewicz anterior, la diferencia que encuentro entre() => int y => int es que la segunda permite llamando con bloques desnudos :
scala> def myfunc(f :() => Int) = println("Evaluated: " + f)
myfunc: (f:() => Int)Unit
scala> def myfunc2(f : => Int) = println("Evaluated: " + f)
myfunc2: (f: => Int)Unit
scala> myfunc({1})
<console>:9: error: type mismatch;
found : Int(1)
required:() => Int
myfunc({1})
^
scala> myfunc2({1})
Evaluated: 1
Use [Symbol Hound] (http://symbolhound.com) en el futuro. –
posible duplicado de [Scala - ¿Qué significa '=> SomeType' significa?] (Http: // stackoverflow.com/questions/7225308/scala-what-does-sometype-means) –
No sé cómo no lo encontré ... Creo que debería cambiarme las gafas ... :) – PrimosK