2014-09-01 79 views
5

如何在范围/环境/绑定中列出所有“变量”(不仅是变量)的名称和/或值?我需要(1)生成一个列表或者(2)打印一个Scala可以访问的所有实体的列表声明。Scala反射:如何列出范围内的所有变量?

+0

的REPL环境中(在此可是可能的)与[Java /运行时]反射通常不同(如果这是不可能的)。 – user2864740 2014-09-01 21:41:56

+0

您需要的是一个可以访问Java完整源代码的工具。斯卡拉不是那种工具。请参阅JavaC编译器,或查看程序转换工具。 – 2014-09-01 22:44:20

+0

我会感谢人们不要修改我问的问题。格式更正很好,澄清很好。但如果你想改变这个问题,请为自己写一个问题。这个问题一般是关于Scala,而不仅仅是REPL。 – 2014-09-01 23:13:56

回答

1

在运行时这是不可能的 - 至少不是你想要的方式 - 因为JVM没有组织成每个语句后更新的符号的巨大表格,您可以随时查询并找到名称为的实体 ,就像你给他们打电话一样(我认为这是跨语言和环境的)。

您可以尝试查询确实组织为表格的内容,例如类/接口的方法,但在之前您必须知道类别的完全限定名称。为了给你一个快速的例子,根据类加载的工作原理,JVM甚至无法枚举你可以创建的类,因为新的类可以实时创建或从某个存储库检索。再举一个例子,import在运行时不存在...

您必须缩小您的需求。例如,如果您定位REPL,那么您可能会修改它以混淆其内部数据结构(但努力会很大)。类似地,如果你的目标是一个脚本并且有权访问这些源代码,那么理论上你可以用一个插件来修改编译器,它可以完成你所需要的工作。被警告我只提到这些事情,但不会考虑自己做这样的事情,因为这需要很大的努力,我看不到任何真正的需要。

3

的问题大致可以理解,但例如REPL有作用域绑定javax.script一些支持:

$ scala 
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> val e = $intp.asInstanceOf[javax.script.ScriptEngine] 
e: javax.script.ScriptEngine = [email protected] 

scala> e.getContext 
res0: javax.script.ScriptContext = [email protected] 

scala> e.getContext.getScopes 
res1: java.util.List[Integer] = [100, 200] 

scala> e.getContext.getBindings(100) 
res2: javax.script.Bindings = {} 

而且REPL本身保持,可以进行查询的范围,表示当前的历史被自动导入到脚本的当前行会话:

scala> $intp.replScope 
res3: $intp.global.Scope = Scopes(value $intp, value e, value res0, value res1, value res2) 

也有可能行使REPL的完成机制:

scala> :power 
** Power User mode enabled - BEEP WHIR GYVE ** 
** :phase has been set to 'typer'.   ** 
** scala.tools.nsc._ has been imported  ** 
** global._, definitions._ also imported ** 
** Try :help, :vals, power.<tab>   ** 

scala> reader.completion 
res4: scala.tools.nsc.interpreter.Completion = [email protected] 

scala> res4.completer.complete("",0) 
res6: scala.tools.nsc.interpreter.Completion.Candidates = Candidates(0,List($intp, $ires0, $ires1, $ires10, $ires11, $ires12, $ires13, $ires14, $ires15, $ires16, $ires17, $ires18, $ires2, $ires3, $ires4, $ires5, $ires6, $ires7, $ires8, $ires9, $r, AND, BLOCK, CASE, DEFAULT, FALSE, IF, LIT, NEW, NOT, NULL, REF, SOME, SelectStart, TRUE, TRY, UNIT, ZERO, analyzer, classOf, completion, e, fn, global, history, intp, isettings, lastRequest, mkTreeFromSelectStart, mkTreeMethods, mkTreeMethodsFromSelectStart, mkTreeMethodsFromSymbol, nullSafe, phased, power, r, reader, repl, replImplicits, res0, res1, res2, res3, res4, returning, scala$tools$nsc$ast$TreeDSL$CODE$$$outer, treedsl, typed, typer, vals)) 

scala> 

在REPL控制台的单一选项卡提供自动完成功能,在这里显示了我的当前目录下所有的垃圾,这是在类路径默认:

$ scala 
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> 
$intp   broken   enumtest  inheritthewind maker   oracle  sbtbomb    thingy   
P    bumper   erased   inlined   mangled   orelse  scala    throwgen  
Q    butwhen   exh   inliner   mapeach   org   scallop    thrownull  
SO22581163  bytype   eyeshadow  inner   maqicode  othercase  scrap    tiles   
_root_   callbacks  fany   inputcheck  matchprim  out   scripts    timezone  
a    capture   featureless intcake   maybeamb  overdone  searchme   tmp    
abjectfuture cce    ff    interp   maykov   overnullary selfpub    toString  
absval   cdtest   fielding  interpat   metamac   pathmaker  seqto    tops   
adaptation  charmatch  filloval  intpbind   mkarray   peasy   serialmigration  trial   
akka   choosy   filrdr   intupolated  mksym   pet   serious    tribool   
algedu   classOf   findwidgets invokeFrom  modtest   petconfig  shapelessed   tricks   
angeldance  classmatch  finf   isInstanceOf  myanno   phyl   simple-swing  trivial   
annee   classy   fixedimp  isanon   mydays   pickit  singleton   tryxform  
annie   cmpprs   fixes   isfun   myintp   pimpin  slider    tstest   
annoconst  coltfred   fixme   isscala   mypkg   pkginvoke  slow    typeref   
annot   com    flib   java    mypriv   plugincp  smtest    tztest   
anymember  compilit   foodir   javafx   nestedmain  plugs   sobral    unapplynull  
anything  convprs   fooplus  javax   netscape  pointers  somatch    unavail   
applied  copier   for29   jbyte   newfrom   pointopt  some_package  unensured  
arrow   corner   formac   jdk    nextcompleted pos   sortitout   unused   
asInstanceOf counted   ftw   jex    niolock   poster  sounds    updater   
atrait   countints  funk   jext    noany   pow   specbug    valdef   
autoenum  cr    funkstr  jline   noapp   preferthunk speck    vec    
auxctor  ctag    futfilter  jmap    nodep   prettycase splitat    version   
bad-scales  curtest   futuremap  jover   nofeature  primover  stale    vowelshift  
badXlint  cyclic   fval   jperms   nofuture  printer  statik    w    
badaccess  dbadd   gline   junk    noimp   privctor  str2int    warnadapt  
badbob   default-tparam global   k    noinline  privover  strtyp    weakerr   
badgeneric  delayed   goodbye  kcharex   nointerp  procked  structural-return welper   
badimp   delayedsignal gr    keptstar   nonl   protcase  stupid    whose   
badinherit  delineate  grapher  kmap    norec   protval  succinctly   widgets   
badmap   demoapi   groupby  lazyparadox  nosehorn  publicity  sun     wrappedarray 
badmatch  dep    guiced   lazyside   nothingannot q    superduper   wtf    
badover  doc    guy   lazysplit  ns    qqparms  sxema    x    
badoverride dockable   halfinterval lib    nts    quickly  syncd    xmladd   
badpath  dosth   here   liner   nullgroup  quoterep  syshook    xmlex   
badpkg   doublearrow  hidden   linetest   nullpair  rawj   t1     xmlregex  
badseal  dummyonly  hiddenimport linted   nulltype  raws   t1807    xmlreplace  
badstrimp  dynospec   id    linty   nummaker  reader  t5148    xmlsub   
badvargs  earlier   imparted  lit    off    reflectenum t5589    xmlt   
badvol   eatery   imparter  littlecake  oiler5   replslow  t7121    xxx    
bigmethod  email   impctx   looker   old-and-blue repro   t7775    zed    
binder   empty   impless  lookit   oldname   required  t8433        
biterpolator emptypackage  impmag   lookup   om    sample-foo tabpane        
blocking  enclosing  imptest  loopy   oneq   samplewarn taggedparam       
blownfuture enclosingcls  imptrait  macinfer   oops   saver   target        
bounded  enpatch   include  macvar   optdate   sbt-test  teachers       

scala> 
+3

这是一个很好的答案。注意:如果你使用的是Spark REPL,这将不起作用,但你可以使用$ intp.allDefinedNames – 2015-02-13 17:15:06

+0

@TristanReid如果没有upvotes,它不会是一个好的答案。根据SO章程,这是不可能的。我认为有必要将Spark REPL带回到REPL文件中,这样他们可以为其他项目提供REPL文件进行扩展。这可能不是这个REPL。 – 2015-02-13 21:08:47

+0

你错了。并非所有优秀的答案都有提升。顺便说一句,感谢这个伟大的答案! – asgs 2016-11-21 17:15:24