默认参数值总是胜过 Scala 中的隐式吗?

Ste*_*ier 2 scala implicit default-parameters

def foo(implicit i: Int = 1) = i
def bar(implicit j: Int) = foo()

bar(4)
Run Code Online (Sandbox Code Playgroud)

这段代码的计算结果为1. 因此默认值优先于隐式的j,后者被实例化为4。因此,似乎至少在这个例子中,默认参数值胜过implicit,使得 的定义foo等价于def foo(i: Int = 1) = i

默认参数值总是胜过隐式吗?如果是,为什么这个代码是合法的(因为它令人困惑)?如果不是,反例是什么?

有没有办法获得其他行为,即与上述类似的一段代码(具有默认值 for i)将评估为4,而无需显式传递参数?

Dim*_*ima 5

implicit应用于整个参数列表,而不仅仅是单个参数(例如,您可以拥有foo(implicit i: Int, j: Int),并且两个参数都是隐式的,但是,如果您只想要其中一个参数,则必须将它们拆分为两个列表:def foo(i: Int)(implicit j: Int).

因此,要将隐式参数传递给函数,您必须省略整个列表:foo,而不是foo()

当你有def foo(implicit i: Int),foo()甚至不编译,因为你试图发送一个空参数到列表。foo确实(只要隐式 int 在范围内),因为列表是隐式传递的。

使用def foo(implicit i: Int = 1),两者都使用 compile,但意味着不同的东西。foo()表示“foo使用所有参数的默认值调用”,foo表示“调用foo,传递隐式参数列表”。

因此,bar(implicit j: Int) = foo它会评估为 的值j,而bar(implicit j: Int) = foo()评估为 1。