使用隐式和非隐式调用函数

时间:2015-04-01 20:02:13

标签: scala

我试图用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

1 个答案:

答案 0 :(得分:3)

隐式参数部分全部或全部 - 要么显式传递每个参数(假设它们没有默认值),要么都不传递。如果你想让f("foo")工作,你需要做这样的事情:

def f(y: String)(implicit x: Int) = y

我对这种方法要小心,但是我个人越来越倾向于认为除了类型类实例之外的任何事情使用implicits是一个坏主意,并且有一个隐含的Int值浮动的类型是善良的可怕的。