考虑这个案例类:
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
听起来是个坏主意吗?我该如何解决这个问题?
答案 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
的行为就像我希望它表现一样(因为printProxy
在IntPrinter
的范围内。)