Подтвердить что ты не робот

У Scala есть интроспекция, способная что-то подобное Python dir()?

Да, я знаю, что он считал ленивым не-питонисты. Причина, по которой я спрашиваю, заключается в том, что документация по-прежнему крайне не хватает во многих библиотеках Scala (например, Scala -dbc, но это не все, что я ищу), и если бы я мог видеть атрибуты объекта/класса во время выполнения, Я мог бы хотя бы выяснить, что доступно. Спасибо.

4b9b3361

Ответ 1

Scala не имеет API отражения. Единственный способ получить доступ к этой информации - использовать API отражения Java. Это имеет тот недостаток, что структура может измениться, поскольку способ 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])

Ответ 2

Это одно из моих основных применений для REPL. Введите имя объекта, точку, а затем TAB и покажет все доступные методы.

Это не идеально. Во-первых, он показывает защищенные методы, которые не будут доступны, если вы не расширяете класс. С другой стороны, он не показывает методы, доступные через неявное преобразование.

И, конечно же, все IDE способны это сделать.

Ответ 3

Вам может понадобиться что-то вроде следующего, которое даст вам то, что вам нужно. В этом случае он работает на String, очевидно.

val testStr = "Panda"
testStr.getClass.getMethods.foreach(println)

Это работает?

Ответ 4

Возможно, вы захотите использовать этот небольшой помощник, чтобы усилить REPL