Scala将命名和默认参数与隐式参数结合使用

时间:2012-02-23 16:10:16

标签: scala default-value named-parameters implicits

请考虑以下事项:

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 个答案:

答案 0 :(得分:15)

尝试

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

一旦开始指定参数,就无法返回。它可能是整个列表是隐含的,也可能都不是。

答案 1 :(得分:4)

隐式参数应该单独进行 - 首先,在方法定义的最后 - 第二个。像这样:

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

OUPUTS

size: 2

答案 2 :(得分:0)

按照jsuereth的说法,你可以将你的函数定义为

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

或者我比较习惯看的方式,

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