2012-02-23 23 views
11

considerar lo siguiente:Scala nombre y los argumentos por defecto en conjunción con los parámetros implícitos

def f(implicit a: String, y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

La última expresión provoca el error siguiente:

not enough arguments for method f: (implicit a: String, implicit y: 
Int)java.lang.String. Unspecified value parameter a. 

Sin embargo, si se proporciona un valor por defecto a la implícita parámetro a, no hay problema:

def f(implicit a: String = "haha!", y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

Pero la última línea imprime s

haha!: 2 

mientras que yo hubiera esperado

size: 2 

lo tanto, el valor implícito 's' no es recogido. Si por el contrario no proporciona ningún parámetro a F y acaba de llamar

println(f) 

entonces el valor implícito es recogido y se obtiene

size: 0 

Puede alguien arrojar alguna luz sobre lo que está pasando aquí?

Respuesta

15

Trate

println(f(y = 2, a = implicitly)) 

Una vez que comience la especificación de parámetros, no se puede volver atrás. O bien toda la lista está implícita o nada de eso.

0

A lo largo de las líneas de lo jsuereth dijo, se podría definir su función como

def f(a: String = implicitly, y:Int = 0) = a + ": " + y 

O en la forma en que estoy más acostumbrados a ver,

def f(y:Int = 0)(implicit a: String) = a + ": " + y 
+2

Debe comprobar qué alcance implícito de que implícitamente está utilizando. No creo que sea lo mismo que la segunda opción. – jsuereth

4

parámetros implícitos deben ir por separado - - primero, y al final de la definición del método - segundo. De esta manera:

def f(y: Int = 0)(implicit a: String) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

ouputs

size: 2 
+0

Para utilizar el primer parámetro predeterminado debe llamar a 'f()'. – raisercostin

Cuestiones relacionadas