2011-08-05 15 views
62

Soy nuevo en Scala y me gusta mucho, pero a veces me sorprende. Por ejemplo:¿Qué => y() => decir en Scala

clickedCallbacks: List[() => Unit]) 

Podría alguien decirme lo que significa => y () => en Scala?

+0

Por favor, consulte esta publicación en el blog "[¿Cómo encuentro lo que significa o hace algún símbolo?] (Http://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html)" – Sun

Respuesta

95

=> es el azúcar sintáctica para la creación de instancias de funciones. Recuerde que cada función en scala es una instancia de una clase.

Por ejemplo, el tipo Int => String, es equivalente al tipo Function1[Int,String] es decir una función que toma un argumento de tipo Int y devuelve un String.

scala> val f: Function1[Int,String] = myInt => "my int: "+myInt.toString 
    f: (Int) => String = <function1> 

    scala> f(0) 
    res0: String = my int: 0 

    scala> val f2: Int => String = myInt => "my int v2: "+myInt.toString 
    f2: (Int) => String = <function1> 

    scala> f2(1) 
    res1: String = my int v2: 1 

Aquí myInt binded al valor argumento pasado a f y f2.

() => T es el tipo de una función que no toma argumentos y devuelve T. Es equivalente a Function0[T]. () se llama una lista de cero parámetros, creo.

scala> val f:() => Unit =() => { println("x")} 
f:() => Unit = <function0> 

scala> f() 
x 

scala> val f2: Function0[Unit] =() => println("x2") 
f:() => Unit = <function0> 

scala> f2() 
x2 
5

=> es la "función de la flecha". Se usa tanto en firmas de tipo de función como en términos de función anónima. () => Unit es una abreviatura de Function0[Unit], que es el tipo de funciones que no tienen argumentos y nada útil (como void en otros idiomas) regresan.

13

() => Unit significa: "función Type que no toma parámetros y nada volver"

Así que si se declara un valor f a ser una función que no toma parámetros y devuelve nada su tipo sería:

val f :() => Unit 

Dado que este es un val tiene que asignar un valor, por ejemplo, una función que imprime Hola mundo

val f :() => Unit =() => println("Hola Mundo") 

que dice: * "f es una función que no toma parámetros y devuelve nada inicializado con el código println("Hola Mundo")

Dado que en Scala puede utilizar la inferencia de tipos que no tiene que declarar el tipo por lo que el siguiente sería equivalente:

val f =() => println("Hola Mundo") 

para alegar ésta puede simplemente:

f() 

>"Hola mundo" 

O, ya que las funciones son también objetos que se pueden invocar la apply Método:

f.apply() 
> "Hola Mundo" 

Es por eso que en su declaración que dice "Voy a tener una lista que llevará a cabo las funciones sin params y no hay tipos de retorno" de ahí Lista [() => Unidad]

Espero que esto ayude.

73

=> tiene varios significados en Scala, todos relacionados con su significado matemático como implicación.

  • En un valor, se introduce un literal de la función, o lambda. p.ej. el bit dentro de las llaves en List(1,2,3).map { (x: Int) => x * 2 }

  • En un tipo, con los símbolos de ambos lados de la flecha (por ejemplo A => T, (A,B) => T, (A,B,C) => T, etc.) que es azúcar para Function<n>[A[,B,...],T], es decir, una función que toma parámetros de escriba A[,B...] y devuelve un valor de tipo T.

    • parens vacíos en el lado izquierdo (por ejemplo () => T) indican que la función no toma parámetros (también a veces llamado un "thunk");

    • parens vacías en el lado derecho denotan que vuelva () — el único valor de tipo Unit, cuyo nombre también se puede escribir () — todavía confundido? :)

      Una función que devuelve Unidad también se conoce como procedimiento, normalmente un método que se llama solo por sus efectos secundarios.

  • En la declaración de tipo de un parámetro de método o función, con ningún símbolo en el lado izquierdo (por ejemplo def f(param: => T)) que es un "parámetro por nombre", que significa que se evalúa cada vez que se usa dentro de la cuerpo de la función, y no antes. Los parámetros ordinarios de "valor por valor" se evalúan antes de ingresar a la función/método.

  • En una cláusula case, separan el patrón (y la protección opcional) de la expresión de resultado, p. case x => y.

+0

Gracias, yo estaba buscando el significado del "parámetro nombre", no mencionado en ninguna otra respuesta. Se usa cuando se requiere una "evaluación diferida". – jp48

3

Como la respuesta más simplificada, se puede sustituir lo que está en el lado izquierdo de la => con la palabra "izquierda" y lo que está en el lado derecho con la palabra "derecho".

Entonces, el significado de "IZQUIERDA => DERECHO" se convierte en:

gire a la izquierda y luego hacer lo correcto.

Esto significa que si usted tiene un "() =>" que se puede tomar nada (es decir, no hay parámetros) y luego hacer lo que está en el lado derecho.

Este es el significado más común.

Cuestiones relacionadas