如何在Scala中获取方法或对象的包?

时间:2019-03-07 08:26:48

标签: scala

如何在Scala中获取方法或对象的包?

例如

import scala.math._
round().getClass // errors

是否可以获取所需的输出"scala.math.round"?这样我可以确定round()方法不会来自我导入的任何其他包。

PS。不使用Intellij IDE。 IDE会向您显示此信息,因此必须有一个IDE调用的函数来获取此信息。

编辑: 例如,在scala shell中运行这些命令

1 个答案:

答案 0 :(得分:2)

通过Scala反射(libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value中的build.sbt),您可以做到

import scala.math._
import scala.reflect.runtime.universe._

object App {
  def main(args: Array[String]): Unit = {
    println(
      showRaw(reify {
        round(???)
      })
    )
  }
}

运行时的输出将为

Expr(Apply(Select(Ident(scala.math.package), TermName("round")), List(Select(Ident(scala.Predef), TermName("$qmark$qmark$qmark")))))

或者您可以将scalacOptions in Compile ++= Seq("-Xprint-types", "-Xprint:typer")添加到build.sbt

然后编译

package pckg

import scala.math._

object App {
  round(???)
}

将产生(在编译时)

Warning:scalac: package pckg{pckg.type} {
  import scala.math._;
  object App extends scala.AnyRef {
    def <init>(): pckg.App.type = {
      App.super{pckg.App.type}.<init>{()Object}(){Object};
      (){Unit}
    }{Unit};
    scala.math.`package`.round{(x: Long)Long}(scala.Predef.???{Nothing}){Long}
  }
}