在Scala中注入implicits

时间:2017-12-01 03:32:52

标签: scala implicit

我有以下特点:

trait Tr1 {
  implicit val i: Int
}

trait Ctx { tr: Tr1 =>
  def test: Int = implicitly[Int]
}

现在我按照以下方式运行我的应用程序:

  def main(args: Array[String]): Unit = {
    val ctx: Ctx = new Ctx with Tr1 {
      override implicit val i: Int = 123
    }
    println(ctx.test) //prints 123!!!
  }

令人惊讶的是它会打印123。我认为我们val i已经窘迫地初始化为0,但编译器发现我们已经将实例覆盖implicit val i: Int到值123

现在我对这种情况下的隐式解决方案感到困惑。你能取悦吗?

1 个答案:

答案 0 :(得分:1)

trait Ctx { tr: Tr1这是自我类型,这意味着它需要Tr1 Ctx extendimplicitly[Int]它是Tr1试图找到隐含的Int 变量。由于implicitly[Int]定义了一个隐式val i 变量,因此编译器可以推断implicit val i: Int = 123当前是隐式val i 范围。

因此,当您覆盖test时,123方法将返回map(a).map(b)