2009-12-29 7 views
17

Sì, lo so che è considerato pigro dai non-Pythonistas. La ragione per cui chiedo è che la documentazione è ancora tristemente carente in molte librerie Scala (es. Scala-dbc, ma non è tutto ciò che sto guardando), e se potessi vedere gli attributi di un oggetto/classe in fase di esecuzione, potrei meno capire cosa è disponibile. Grazie.Scala ha un'introspezione capace di qualcosa di simile alla dir() di Python?

risposta

10

Scala non ha un'API di riflessione. L'unico modo per accedere a queste informazioni è utilizzare Java reflection API. Questo ha lo svantaggio che la struttura può cambiare come il modo in cui Scala è rappresentata nelle classi Java e le interfacce potrebbero cambiare in futuro.

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

Alcuni dati tipo specifico che è presente nel codice byte può essere raggiunto con la ScalaSigParser.

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

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

Questo è uno dei miei principali utilizzi per REPL. Digitare il nome dell'oggetto, punto, e quindi TAB e mostrerà tutti i metodi disponibili.

Non è perfetto. Per prima cosa, mostra metodi protetti, che non saranno disponibili a meno che non stiate estendendo la classe. Per un'altra cosa, non mostra metodi disponibili attraverso la conversione implicita.

E, naturalmente, gli IDE sono tutti in grado di farlo.

+0

Sì, questa è la mia soluzione iniziale, ma in IntelliJ IDEA 9 (usando Scala 2.7.7) non ottengo abbastanza informazioni dalla Scala. classe dbc, in particolare, quando si costruisce una query (per la quale ho davvero bisogno di documentazione più dell'introspezione, ma questa era l'ultima risorsa). – JohnMetta

5

Si potrebbe desiderare qualcosa come il seguente che ti darebbe quello che ti serve. In questo caso, opera su una stringa, ovviamente.

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

Funziona?

0

si consiglia di utilizzare this piccolo aiutante per rinforzare il REPL

Problemi correlati