2012-01-10 19 views
7

Voy a través de una elevación libro en acción y me encontré con algo que no entiendo muy bien: _ ::¿Qué significa _ :: en Scala?

object permanent_link extends MappedString(this, 150){ 
    override def validations = 
    valMinLen(3, "Link URL must be at least 5 characters") _ :: 
    super.validations 
} 

No puedo encontrar ningún indicio por lo que agradecería si alguien podría ayudar me sale ..

Respuesta

18

No lo sé Levantar, pero esta es una pregunta general. En primer lugar, la :: es un operador contras Scala:

scala> 1 :: 2 :: List(3, 4) 
res0: List[Int] = List(1, 2, 3, 4) 

Esto significa que super.validations es una especie de secuencia y valMinLen(3, "Link URL must be at least 5 characters") _ es un valor único en esa lista.

Por el contexto parece obvio que en el método sobrescrito validations que están llamando a la versión super y Prepend una validación adicional al principio.

Esta validación adicional se crea mediante una llamada al valMinLen(). Sin embargo, esta llamada adicional no devuelve un elemento que coincida con el tipo de lista validations, sino una función. En lugar de anteponer el valor de la función, estamos diciendo explícitamente (añadiendo _ sufijo`) que queremos anteponer una función en sí misma, no un valor de retorno de esa función.

Código fragmento vale más que mil palabras:

scala> def f = 3 
f: Int 

scala> def g = 4 
g: Int 

scala> val listOfInts = List(f, g) 
listOfInts: List[Int] = List(3, 4) 

scala> val listOfFunctions = List(f _, g _) 
listOfFunctions: List[() => Int] = List(<function0>, <function0>) 

comparar el tipo de listOfInts y listOfFunctions. Creo que la sintaxis f _ se llama parcialmente aplicada a la función en Scala world.

5

El subrayado indica que valMinLen no se debe llamar, sino que se debe utilizar como un "puntero" de función.

El operador :: concatena listas.

Sería en otras palabras, parece ser el código crea una lista validations que constan de una función de "puntero" a valMinLen con los parámetros dados y el resto de la lista es el valor de super.validations, es decir las validaciones súper clase .

Estoy seguro de que alguien va a corregir mi terminología aquí :)

0

El código podría ser más fácil de leer con un poco de sangrado adecuado e introduciendo un val:

object permanent_link extends MappedString(this, 150) { 

    override def validations = minimumValidation :: super.validations 

    val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _ 
} 

Así como se ha señalado antes, el operador :: simplemente antepone un nuevo elemento a una lista, el _ no tiene nada que ver con ello y se usa para obtener un objeto función, como en

(1 :: 2 :: Nil) map (println _) 

que hace una lista [1, 2] y aplica la función println a cada elemento (el guión bajo se puede omitir aquí). El objeto println _ construye un objeto de función del método println con el _ que representa el parámetro único de la función.

+0

¿Puede hacer referencia a "minimumValidation" antes de haberlo declarado? – ziggystar

+0

El orden de la declaración no importa en scala, no lo hace en la mayoría de los idiomas actuales. – Ramses