2012-02-23 10 views
11

Rozważmy następujący:Scala nazwie i domyślne argumenty w połączeniu z parametrami ukrytych

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

ostatniego wyrażenia powoduje następujący błąd:

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

Jeśli jednak podać wartość domyślną niejawny parametr a, nie ma problemu:

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

Ale ostatnia linia wydruku s

haha!: 2 

podczas Liczyłam

size: 2 

Więc wartość niejawny 's' nie jest pobierany. Jeśli natomiast nie dostarczają żadnych parametrów do F i po prostu zadzwonić

println(f) 

wówczas wartość niejawna jest zabierane i masz

size: 0 

Czy ktoś może rzucić nieco światła na to, co się tu dzieje?

Odpowiedz

15

Spróbuj

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

Po uruchomieniu określający parametry, nie można wrócić. Jest to albo cała lista jest domniemana, albo żadna z nich nie jest.

0

Wzdłuż linii co jsuereth powiedział, można zdefiniować swoją funkcję jako

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

lub w sposób jestem bardziej przyzwyczajeni,

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

Należy sprawdzić, które implicite zakres które pośrednio korzysta. Nie sądzę, żeby to było to samo, co druga opcja. – jsuereth

4

niejawne parametry powinny iść osobno - - pierwsza i na końcu definicji metody - druga. Tak:

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

ouputs

size: 2 
+0

Aby użyć pierwszego domyślnego parametru, należy wywołać 'f()'. – raisercostin