2011-08-29 21 views

Respuesta

10

Significa un bloque de código que puede ejecutar.

Así, por ejemplo:

scala> def doTwice(op: =>Unit) = {op; op} 
doTwice: (op: => Unit)Unit 

scala> doTwice({println("Hi")}) 
Hi 
Hi 

En este caso el =>Unit es {println("Hi")}

aquí "SomeType" es la unidad, porque println no produce un valor. Si produjo un Int, sería =>Int.

+1

Oooh, ya veo. ¡Gracias! Esto es lo que odio de Scala. Es ridículamente difícil googlear cosas como esta :) Gracias a Dios por la buena gente y stackoverflow :) – Arg

+4

Buen ejemplo. Aquí, 'op' se conoce como parámetro * call by name * (en lugar de * por value *). Tenga en cuenta que funcionaría igual de bien escribir 'doTwice (println (" Hi "))'. Cuando llama a una función en Scala, la sintaxis no indica si está pasando un parámetro por * nombre * o por * valor *. –

+2

@Arg [SymbolHound] (http://symbolhound.com/) es tu amigo. –

2

Es solo un tipo de valor de función que no requiere parámetros. El ejemplo de Owen es genial, solo sé que "A => B" es una función con un parámetro que tiene tipo A y valor de retorno con tipo B y "=> B" es una función que no toma parámetros y regresa un valor con tipo B.

6

Indica dos cosas. En primer lugar, debido a la prefijación =>, indica que el parámetro se aprobará by name. Luego, indica que el tipo de parámetro pasado debe ser SomeType.

Algunas personas combinan las dos, pensando => SomeType es un tipo en sí mismo - no lo es. Es una conjunción de dos cosas: estrategia de evaluación de parámetros y tipo de parámetro.

Así, breve explicación en la llamada por su nombre, en caso de que el enlace de wikipedia no dejar las cosas claras, si usted tiene esto:

def f[A](x: => A) = { x; x } 
f(some stuff) 

Scala ejecutará Entonces esto así:

{ some stuff; some stuff } 

en una llamada por valor, lo que sucede es de la misma familia:

val x = some stuff 
{ x; x } 

Tenga en cuenta también que el parámetro es siempre evaluado en llamada por valor, pero solo una vez. En llamada por nombre, el parámetro puede nunca evaluarse (si está en una rama no ejecutable de if, por ejemplo), pero puede evaluarse muchas veces.

+1

¿qué representa [A] en este caso? Lo he visto en varios lugares, pero aún no lo entiendo –

+1

@elimence Es un parámetro _type_. Es un tipo que no se conoce en el momento en que se declara 'f', pero se conocerá en el punto en que se usa' f'. La función 'f' es válida para todos los tipos' A', y, en este caso, no hay restricciones sobre lo que 'A' puede ser.Podría haber usado 'A <: SomeConcreteType' para indicar un límite inferior (' A' debe ser un 'SomeConcreteType' o subtipo de él),' A>: SomeOtherType' ('A' debe ser una superclase de' SomeOtherType') , así como indicar que 'A' debe ser parte de algún parámetro implícito, lo que conduce a limitaciones arbitrarias sobre lo que 'A' puede ser. –

+0

Gracias Daniel, lo tengo ahora –