我试图用implicit
参数来定义,我认为是"默认参数":
scala> def f(implicit x: Int, y: String) = y
f: (implicit x: Int, implicit y: String)String
注意 - 我试图将implicit x: Int
定义为第二个参数,但是我遇到了编译时错误:
scala> def f(y: String, implicit x: Int) = y
<console>:1: error: identifier expected but 'implicit' found.
def f(y: String, implicit x: Int) = y
无论如何,我定义了implicit Int
。
scala> implicit val x: Int = 100
x: Int = 100
然后我没有用f
参数调用String
:
scala> f("foo")
<console>:10: error: not enough arguments for method f:
(implicit x: Int, implicit y: String)String.
Unspecified value parameter y.
f("foo")
^
接下来,我尝试通过指定参数来调用f
函数。那也失败了。
scala> f(y = "foo")
<console>:10: error: not enough arguments for method f:
(implicit x: Int, implicit y: String)String.
Unspecified value parameter x.
f(y = "foo")
^
是否可以通过提供隐式并仅为f
提供单个参数来调用函数y
?
答案 0 :(得分:3)
隐式参数部分全部或全部 - 要么显式传递每个参数(假设它们没有默认值),要么都不传递。如果你想让f("foo")
工作,你需要做这样的事情:
def f(y: String)(implicit x: Int) = y
我对这种方法要小心,但是我个人越来越倾向于认为除了类型类实例之外的任何事情使用implicits是一个坏主意,并且有一个隐含的Int
值浮动的类型是善良的可怕的。