Как получить пакет методов или объектов в Scala?

#scala

#scala

Вопрос:

Как получить пакет методов или объектов в Scala?

Например

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

Есть ли способ получить желаемый результат: "scala.math.round" ? Чтобы я мог быть уверен, что метод round() не исходит ни из какого другого пакета, который я импортировал.

PS. Без использования Intellij IDE. Среда IDE показывает вам эту информацию, следовательно, должна существовать функция, которую IDE вызывает для получения этой информации.

РЕДАКТИРОВАТЬ: например, выполнение этих команд в оболочке scala

Комментарии:

1. Когда вы хотите получить эту информацию? Где вы хотите его получить? Компилятор располагает этой информацией, откуда ее получает IDE (IDEA использует свой собственный компилятор Scala, большинство других IDE используют компилятор Scala из Lightbend).

2. Я предполагаю, что, исходя из мира python, концепция отражения мне чужда.

3. «следовательно, должна существовать функция, которую IDE вызывает для получения этой информации» Не обязательно должна быть функция . Компилятор знает это, поэтому IDE знает. Вы можете запускать команды в командной оболочке gist.github.com/DmytroMitin/c6a24c172f28c2545b00a405cbd8c082

4. @SidaZhou На самом деле вы можете просто попробовать вызвать метод без параметров в командной оболочке, и ошибка компиляции выдаст имя пакета: error: missing argument list for method round in package math .

5. Я думаю, это немного помогает, но не отображает полную цепочку пакетов.

Ответ №1:

С помощью отражения 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}
  }
}