【问题标题】:Implicit resolution from trait特征的隐式解析
【发布时间】:2015-06-26 20:49:12
【问题描述】:

我有一个类似于以下情况的用例:

trait A {
  implicit val x = "hello"
}

class B {

  // somehow bring x into scope here???

  def run(x: Int)(implicit y: String) = y + x
}

println((new B).run(3))

我知道我需要将 trait 中定义的x 带入 B 的隐式范围内。我已经尝试了以下方法:

# attempt 1 #
class B extends A { .... } /// doesn't work

# attempt 2 #
class B extends A {

  val x1 = implicitly[String]  /// doesn't work either

  def run(x: Int)(implicit y: String) = y + x
}

请解释我在这里遗漏了什么(或者,指出我可以研究的相关理论主题,对 scala 来说相当新)。

【问题讨论】:

    标签: scala


    【解决方案1】:

    'implicit y' 的值将在您的 println-line 中解析,如果它不可用。您正在使变量在类的主体中隐式可用,但在那里不需要隐式 String 的解析。

    隐式不是魔术;如果你不能显式地访问隐式变量,那么编译器也不能。

    你真正想解决什么问题?

    【讨论】:

      【解决方案2】:

      将整个代码包装在一个对象中,并将trait A 扩展为class B

        object P {
          trait A {
            implicit val x = "hello"
          }
          class B extends A {
            def run(y: Int) = y + x
          }
         def f = println(new B().run(3))
        }
      

      输出:

      scala> P.f
      3hello
      

      【讨论】:

      • 这行得通。虽然如果不是太多,你能解释一下为什么会这样吗?
      • 为什么@thoredge 在他的回答中回答了。
      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2012-10-24
      • 2020-12-26
      • 2018-03-21
      相关资源
      最近更新 更多