如何在方法范围内比类范围更喜欢隐式?

kri*_*ath 1 scala implicit

我有一个类似于下面的代码的 Scala 代码。在类/对象级别有一个隐式定义,我想用方法中定义的隐式“覆盖”它。(如果您真的需要知道,我需要ExecutionContext专门针对所讨论的方法更改我的内容)。

在这个例子中,我想在方法的范围内b用作隐式 for 。我怎样才能做到这一点?Intbar

object Foo {
  implicit val a: Int = 1
  def bar: Int = { // Didn't pass implicit Int parameter
    implicit val b: Int = 2
    implicitly[Int]
  }
}
Run Code Online (Sandbox Code Playgroud)

这抱怨

错误:不明确的隐式值:Int 类型的对象 Foo 中的值 a 和 Int 类型的值 b 均匹配预期的 Int 类型

所以我认为 Scala 不能在隐式类范围和隐式方法范围之间进行选择。

Jas*_*r-M 7

在 dotty/scala 3 中,它应该已经按预期工作(第二个要点)。在 Scala 2 中,您必须通过给它们相同的名称来隐藏外部作用域中的隐式。

object Foo {
  implicit val a: Int = 1
  def bar: Int = {
    implicit val a: Int = 2
    implicitly[Int] // 2
  }
}
Run Code Online (Sandbox Code Playgroud)

这是在 Scala 3 编译器的实现中使用的策略,当它用 Scala 2 编译时:http : //dotty.epfl.ch/docs/internals/contexts.html#using-contexts