2012-02-23 5 views
11

Si consideri il seguente:Scala di nome e argomenti di default in combinazione con i parametri impliciti

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

L'ultima espressione provoca il seguente errore:

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

Tuttavia, se si fornisce un valore di default per l'implicito parametro a, non vi è alcun problema:

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

Ma l'ultima riga stampa s

haha!: 2 

mentre mi sarei aspettato

size: 2 

Quindi 's' il valore implicito non viene prelevato. Se invece non forniscono alcuna parametri f e basta chiamare

println(f) 

allora il valore implicito viene raccolto e si ottiene

size: 0 

Qualcuno può far luce su quello che sta succedendo qui?

risposta

15

Prova

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

volta che si inizia specificando i parametri, non si può tornare indietro. È o l'intera lista è implicita o nulla di ciò che è.

0

Lungo le linee di quello che jsuereth detto, si potrebbe definire la funzione di

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

O nel modo sono più abituati a vedere,

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

Si dovrebbe controllare che la portata implicito che implicitamente utilizza. Non penso sia uguale alla seconda opzione. – jsuereth

4

parametri impliciti dovrebbero andare a parte - - prima e alla fine della definizione del metodo - secondo. Come questo:

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

ouputs

size: 2 
+0

Per utilizzare il primo parametro predefinito deve chiamare 'f()'. – raisercostin