Scala是否具有类似于Python的dir()函数的内省功能?

24

是的,我知道在非Python圈子中看来这很懒惰。我问的原因是因为许多Scala库仍然缺乏文档(例如Scala-dbc,但这不是我关注的全部),如果我能够在运行时查看对象/类的属性,我至少可以弄清楚可用的内容。谢谢。

4个回答

11

Scala没有反射API。访问此信息的唯一方式是使用Java反射API。这种方法的缺点是,随着Scala在Java类和接口中表示方式的更改,结构可能会发生改变。

scala> classOf[AnyRef].getMethods
res0: Array[java.lang.reflect.Method] = Array(public final void ...

可以通过ScalaSigParser访问字节码中存在的某些特定类型信息。

import tools.scalap.scalax.rules.scalasig._
import scala.runtime._

val scalaSig = ScalaSigParser.parse(classOf[RichDouble])

10

这是我使用REPL的主要用途之一。输入对象名称、点号,然后按TAB键,它将显示所有可用的方法。

它并不完美。首先,它显示受保护的方法,除非你正在扩展该类,否则这些方法将不可用。其次,它不会显示通过隐式转换可用的方法。

当然,所有的IDE都能够做到这一点。


是的,那是我的初始解决方案,但在使用Scala 2.7.7的Intellij IDEA 9中,我无法从scala.dbc类中获取足够的信息,特别是在构建查询时(我真正需要文档而不是内省,但这是最后的办法)。 - JohnMetta

8
您可能需要以下类似的内容,这将为您提供所需的内容。在这种情况下,它显然是基于一个字符串操作的。
val testStr = "Panda"
testStr.getClass.getMethods.foreach(println)

那行吗?


getClass!你在我整个星期里都去哪了?谢谢! - Jeffrey Benjamin Brown

1

你可能想要使用this这个小助手来增强REPL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接