11

考虑以下:

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

有人可以阐明这里发生了什么吗?

4

3 回答 3

15

尝试

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

一旦开始指定参数,就无法返回。要么是整个列表是隐含的,要么不是。

于 2012-02-23T16:38:45.923 回答
4

隐式参数应该分开——首先,在方法定义的末尾——其次。像这样:

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

输出

size: 2
于 2013-01-07T11:41:44.573 回答
0

按照 jsuereth 所说的,您可以将函数定义为

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

或者以我更习惯的方式,

def f(y:Int = 0)(implicit a: String) = a + ": " + y
于 2012-02-23T22:02:14.423 回答