Именованные Scala и аргументы по умолчанию в сочетании с неявными параметрами - PullRequest
11 голосов
/ 23 февраля 2012

Примите во внимание следующее:

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

Последнее выражение вызывает следующую ошибку:

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

Однако, если вы задаете значение по умолчанию для неявного параметра a, нетПроблема:

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

Но последняя строка печатает

haha!: 2

, в то время как я ожидал

size: 2

Таким образом, неявное значение 's' не берется,Если вы вместо этого не предоставляете никакие параметры для f и просто вызываете

println(f)

, тогда неявное значение берется, и вы получаете

size: 0

Может кто-то пролить свет на то, что происходитздесь?

Ответы [ 3 ]

15 голосов
/ 23 февраля 2012

Попробуйте

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

Как только вы начнете указывать параметры, вы не сможете вернуться назад. Либо весь список неявный, либо его нет.

4 голосов
/ 07 января 2013

Неявные параметры должны идти отдельно - сначала, а в конце определения метода - вторыми.Как это:

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

Ouputs

size: 2
0 голосов
/ 24 февраля 2012

В соответствии с тем, что сказал Джусерет, вы можете определить свою функцию как

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

Или, как я привык видеть,

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