2012-09-21 11 views
7

He leído muchos fragmentos de código en Scala que hacen uso del símbolo =>, pero nunca he sido capaz de comprenderlo. Intenté buscar en Internet, pero no encontré nada exhaustivo. Cualquier sugerencia/explicación acerca de cómo se usa/puede usarse el símbolo será de gran ayuda.¿Alguien puede explicar cómo se usa el símbolo "=>" en Scala

(Más specifially, también quiero saber cómo el operador entra en el cuadro de literales de función)

+2

http://www.artima.com/pins1ed/book-index.html#indexanchor busque "cohete" –

+0

posible duplicado de [Necesita ayuda para comprender un fragmento de código scala] (http://stackoverflow.com/ preguntas/12530132/need-help-in-understanding-a-scala-code-snippet) (este es el anterior, pero el otro incluye un fragmento de código por lo que es más responsable en mi humilde opinión) –

Respuesta

14

más que pasajero valores/nombres, => se utiliza para definir un literal de la función, que es una sintaxis alternativa utilizada para define una función.

Tiempo de ejemplo. Digamos que tienes una función que toma en otra función. Las colecciones están llenas de ellas, pero seleccionaremos filter. filter, cuando se usa en una colección (como una Lista), eliminará cualquier elemento que cause que la función que proporcione devuelva falso.

val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy") 
// Let's only grab people who have short names (less than 10 characters) 
val shortNamedPeople = people.filter(<a function>) 

Nos podríamos pase en una función real de otro lugar (def isShortName(name: String): Boolean, tal vez), pero sería más agradable para simplemente colocar allí mismo. Por desgracia, podemos, con literales de funciones.

val shortNamedPeople = people.filter(name => name.length < 10) 

Lo que hicimos aquí es crear una función que toma en una cadena (desde people es de tipo List[String]), y devuelve un valor booleano. Genial, ¿verdad?

Esta sintaxis se utiliza en muchos contextos. Digamos que desea escribir una función que adopte otra función. Esta otra función debe tomar una Cadena y devolver un Int.

def myFunction(f: String => Int): Int = { 
    val myString = "Hello!" 
    f(myString) 
} 
// And let's use it. First way: 
def anotherFunction(a: String): Int = { 
    a.length 
} 
myFunction(anotherFunction) 
// Second way: 
myFunction((a: String) => a.length) 

Eso es lo que son los literales de función. Volviendo a by-name y by-value, hay un truco en el que puede forzar que un parámetro no se evalúe hasta que lo desee. El ejemplo clásico:

def logger(message: String) = { 
    if(loggingActivated) println(message) 
} 

Esto se ve bien, pero en realidad message se evalúa cuando logger se llama. ¿Qué pasa si message demora un tiempo para evaluar? Por ejemplo, logger(veryLongProcess()), donde veryLongProcess() devuelve una Cadena. ¿Ups? Realmente no. Podemos utilizar nuestro conocimiento sobre los literales de funciones para forzar que veryLongProcess() no se invoque hasta que realmente se necesite.

def logger(message: => String) = { 
    if(loggingActivated) println(message) 
} 
logger(veryLongProcess()) // Fixed! 

logger ahora está tomando en una funciónque no toma ningún parámetro (de ahí el desnudo => en el lado izquierdo). Todavía puede usarlo como antes, pero ahora, message solo se evalúa cuando se usa (en el println).

Cuestiones relacionadas