2011-10-28 13 views
11

dado un método definido de la siguiente maneraScala ¿Devuelve una función vacía con 0 parámetros, fea sintaxis?

def descendEach(times:Int)(f:()=>Unit) { 
     for (i <- 1 to times) { 
      // other code 
      f() 
     } 
    } 

cuando se utiliza este método Quiero ser capaz de escribir

gd.descendEach(20){ 
    println(gd.cost) 
} 

pero el compilador Scala sólo deja que me salga con

gd.descendEach(20){() => 
    println(gd.cost) 
} 

que es feo. ¿Me estoy perdiendo de algo? ¿Es posible escribirlo de la primera manera que presenté?

Respuesta

21

Utilice la siguiente sintaxis:

def descendEach[T](times:Int)(f: => T) 

De esta manera no sólo se puede pasar a la función sin adicional () => (esto se llama pase por su nombre), sino también utilizar funciones que devuelven cualquier tipo (no necesariamente Unit) . A veces es conveniente cuando se tiene una función existente que desea pasar pero realmente no se preocupan por su valor de retorno:

def g() = 42 
descendEach(20)(g) 

Tenga en cuenta que con esta sintaxis simplemente está utilizando f, no f().

+2

Gracias Tomasz, eso lo solucionó. Para mi ejemplo, simplemente haciendo 'f: => Unit' también funciona, pero la versión genérica es útil para saber. – npiv

Cuestiones relacionadas