Scala中带符号参数的隐式函数

时间:2017-04-23 02:26:02

标签: scala symbols implicit

为什么打印以下代码:

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()?我在这里俯瞰什么?

2 个答案:

答案 0 :(得分:2)

隐式方法仅在需要时调用,否则会出现许多意外行为。在这里,您不会调用它不包含的方法,或者如果将其传递给需要其他类型变量的方法,则不会调用“implPrint”。

答案 1 :(得分:2)

编译器在无法理解手头代码的语法时会考虑Implicits。在您的第一个示例中,您尝试在Symbol对象上调用pr(),这是编译器无法理解的语法,因此它转向含义。在你的第二个例子中,你声明了一个符号,并且没有对它做任何事情,语法与编译器的解析一致,所以它没有看到含义。