【问题标题】:Scala - implicit method parameter does not workScala - 隐式方法参数不起作用
【发布时间】:2012-08-17 22:50:17
【问题描述】:

我编译如下代码

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

但是编译器抱怨参数的数量。如果只有参数x 标记为隐式,为什么上面的方法会起作用,但在这个例子中不起作用?

【问题讨论】:

    标签: scala implicit-conversion implicit


    【解决方案1】:

    你必须把隐含的参数是一个分隔的,它自己的括号:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        隐式参数是全有或全无。要么显式传递所有这些,要么不传递任何一个,编译器为所有选择隐式。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-26
          • 2018-11-19
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多