3

考虑这个案例类:

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听起来像坏主意吗?我该如何解决这个问题?

4

2 回答 2

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类的成员,所以你可以在类的其余部分继续引用它——就像你可以使用类的任何其他数据成员一样。

于 2012-04-15T18:36:49.230 回答
1

确实,这是正确的行为。implicit值仅在当前范围内搜索,并且print在外部调用IntPrinter意味着它不在类范围内(显然)以及我必须这样做的原因import

做我想做的正确方法:

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

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

于 2012-04-15T18:44:55.847 回答