gpt4 book ai didi

scala - 默认参数值总是胜过 Scala 中的隐含值吗?

转载 作者:行者123 更新时间:2023-12-05 01:43:41 25 4
gpt4 key购买 nike

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

bar(4)

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

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

有没有办法获得其他行为,即类似于上面的一段代码(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),两者都使用编译,但含义不同。 foo() 的意思是“调用foo所有参数的默认值”,foo 的意思是“调用foo,传递隐式参数列表”。

因此,对于 bar(implicit j: Int) = foo,它将评估为 j 的值,而 bar(implicit j: Int) = foo() 的计算结果为 1。

关于scala - 默认参数值总是胜过 Scala 中的隐含值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48715981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com