Scala - 隐式方法参数不起作用

时间:2012-08-17 13:23:03

标签: scala implicit-conversion implicit

我编译以下代码

def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)

但是编译器对于参数的数量抱怨不已。如果仅将参数x标记为隐式参数,为什么上述工作会起作用,但在此示例中它不起作用?

3 个答案:

答案 0 :(得分:4)

你必须把隐含的参数分开,用它自己的括号:

scala> def foo(x2: Int)(implicit x: Int) = println(x2 + x)
scala> implicit val x: Int 2
scala> foo(1)
3

如果将非隐式参数和隐式参数放在同一个括号中,则必须显式传递两个参数,否则编译器会抱怨错误的参数数量。当Scala编译器看到参数被标记为隐式且没有明确传递参数时,它将尝试查找隐式参数。但是在检查隐式参数之前,编译器会检查是否传递了正确的参数。

答案 1 :(得分:2)

这将按您的意愿运作:

def foo(x2: Int)(implicit x: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)

我对Scala的内部和规范并没有太深入,所以我不能深入解释为什么会这样,但你必须通过一组额外的括号来传递含义。

编辑: 因为我很好奇,我看了看互联网。我不会重新输入我刚发现的所有内容,以便您可以在此处找到更详细的信息:http://daily-scala.blogspot.de/2010/04/implicit-parameters.html

答案 2 :(得分:2)

隐式参数是全有或全无。要么你明确地传递了所有这些,要么你没有传递它们中的任何一个,并且编译器选择了所有的隐含。

在示例中,您应该将参数传递给foo,因此您必须传递所有内容。如果foo中只有一个参数,那么它将起作用,因为参数的数量是正确的(并且参数将被显式传递)。如果您在未传递任何参数的情况下致电foo,它也会有效,因为它会为这两个参数选择implicit val x