【问题标题】:Implicit Functions with Symbol argument in ScalaScala 中带有 Symbol 参数的隐式函数
【发布时间】:2017-04-23 02:26:02
【问题描述】:

为什么会打印以下代码:

class TestClass{
  case class printClass(s: Symbol) {
    def pr() = println(s);
  }
  implicit def implPrint(i: Symbol) = printClass(i)
}

object TestObject extends TestClass{
  def main(args:Array[String]) = {
    'x pr
  }
}

而下面的代码没有:

class TestClass{
  implicit def implPrint(i: Symbol) = println(i)
}

object TestObject extends TestClass{
  def main(args:Array[String]) = {
    'x

    ()
  }
}

据我所知,编译器会自动调用隐式函数,如果它认为这是一个好主意。为什么编译器在这两种情况下都不调用implPrint()?我在这里俯瞰什么?

【问题讨论】:

    标签: scala symbols implicit


    【解决方案1】:

    当编译器无法理解手头代码的语法时,它会考虑隐式。在您的第一个示例中,您尝试在 Symbol 对象上调用 pr(),编译器无法理解语法,因此它转向隐式。在您的第二个示例中,您声明了一个 Symbol 并且什么都不做,语法与编译器的解析一致,因此它不考虑隐式。

    【讨论】:

      【解决方案2】:

      隐式方法只有在需要时才会调用,否则会出现很多意想不到的行为。而这里,你不要调用它上面不包含的方法,或者如果它被传递给需要其他类型变量的方法,'implPrint'将不会被调用。

      【讨论】:

        猜你喜欢
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2020-11-10
        • 1970-01-01
        相关资源
        最近更新 更多