使用显式值传递给隐式参数作为新的隐式值

时间:2012-04-15 18:08:36

标签: scala implicit

考虑这个案例类:

case class IntPrinter(implicit val i: Int) {
  def print()(implicit i: Int) = println(i)
}

我可以实例化显式传递隐式参数的值,如下所示:

val p = IntPrinter()(9)

我在IRC中被告知,从现在开始,显式传递的值将在被调用时隐式传递给print,但事实并非如此:

p.print()
 error: could not find implicit value for parameter i: Int

我做错了什么或者我误解了/给出了错误的信息?有没有办法实现这个目标?


编辑:事实上,如果我导入p._,就会按预期工作:

import p._
p.print()

确实打印9

这是正确的行为吗?使用import听起来是个坏主意吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不确定我理解。为什么你需要在这里隐含?看起来你可以轻松地做到这一点:

scala> case class IntPrinter(i: Int) { def print() = println(i) }
defined class IntPrinter

scala> val p = IntPrinter(9)
p: IntPrinter = IntPrinter(9)

scala> p.print()
9

或者,如果您真的使用IntPrinter采取隐含的:

scala> case class IntPrinter(implicit val i: Int) { def print() = println(i) }
defined class IntPrinter

scala> val p = IntPrinter()(9)
p: IntPrinter = IntPrinter(9)

scala> p.print()
9

基本上,在这种情况下,您无需指定它是隐式两次;当你第一次声明它是隐式时,它使i成为类的成员,所以你可以继续在整个类的其余部分引用它 - 就像你可以与类的任何其他数据成员一样。 / p>

答案 1 :(得分:1)

确实这是正确的行为。仅在当前范围内搜索implicit值,并且在print之外调用IntPrinter表示它不在类范围内(显然),以及我必须import它的原因。< / p>

做我想做的正确方法:

case class IntPrinter(implicit val i: Int) {
  def print()(implicit i: Int) = println(i)
  def printProxy() = print()
}

然后调用p.printProxy的行为就像我希望它表现一样(因为printProxyIntPrinter的范围内。)