【问题标题】:Injecting implicits in Scala在 Scala 中注入隐式
【发布时间】:2017-12-01 11:53:46
【问题描述】:

我有以下特点:

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 的实例。

现在我对这种情况下的隐式解析感到困惑。能解释一下吗?

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

    trait Ctx { tr: Tr1 它是一个 self 类型,这意味着它需要 Tr1 for Ctx 就像 extend 它,而 implicitly[Int] 它正在尝试找到一个 implicit Int 变量。由于Tr1 定义了一个implicit val i 变量,所以compiler 可以推断implicitly[Int] 在当前范围内是implicit val i p>

    因此,当您覆盖 implicit val i: Int = 123 时,test 方法将返回 123

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2019-08-12
      • 2012-01-15
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多