【发布时间】:2010-12-30 16:48:58
【问题描述】:
是的,我知道非 Pythonistas 认为它很懒惰。我问的原因是,许多 Scala 库(例如 Scala-dbc,但这并不是我所关注的全部)中仍然严重缺乏文档,如果我可以在运行时看到对象/类的属性,我可以至少弄清楚什么是可用的。谢谢。
【问题讨论】:
标签: scala introspection
是的,我知道非 Pythonistas 认为它很懒惰。我问的原因是,许多 Scala 库(例如 Scala-dbc,但这并不是我所关注的全部)中仍然严重缺乏文档,如果我可以在运行时看到对象/类的属性,我可以至少弄清楚什么是可用的。谢谢。
【问题讨论】:
标签: scala introspection
Scala 没有反射 API。访问此信息的唯一方法是使用Java reflection 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])
【讨论】:
这是我对 REPL 的主要用途之一。键入对象的名称、点,然后按 TAB,它将显示所有可用的方法。
它并不完美。一方面,它显示了受保护的方法,除非您扩展类,否则这些方法将不可用。另一方面,它没有显示通过隐式转换可用的方法。
当然,IDE 都可以做到这一点。
【讨论】:
您可能想要以下内容,它可以满足您的需求。在这种情况下,它显然对字符串进行操作。
val testStr = "Panda"
testStr.getClass.getMethods.foreach(println)
这行得通吗?
【讨论】:
getClass!我整个星期你都去哪儿了?谢谢!
您可能想使用 this 小助手来增强 REPL
【讨论】: