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,而无需显式传递参数?
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。
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |