如何在范围/环境/绑定中列出所有“变量”(不仅是变量)的名称和/或值?我需要(1)生成一个列表或者(2)打印一个Scala可以访问的所有实体的列表声明。Scala反射:如何列出范围内的所有变量?
回答
在运行时这是不可能的 - 至少不是你想要的方式 - 因为JVM没有组织成每个语句后更新的符号的巨大表格,您可以随时查询并找到名称为的实体 ,就像你给他们打电话一样(我认为这是跨语言和环境的)。
您可以尝试查询确实组织为表格的内容,例如类/接口的方法,但在之前您必须知道类别的完全限定名称。为了给你一个快速的例子,根据类加载的工作原理,JVM甚至无法枚举你可以创建的类,因为新的类可以实时创建或从某个存储库检索。再举一个例子,import
在运行时不存在...
您必须缩小您的需求。例如,如果您定位REPL,那么您可能会修改它以混淆其内部数据结构(但努力会很大)。类似地,如果你的目标是一个脚本并且有权访问这些源代码,那么理论上你可以用一个插件来修改编译器,它可以完成你所需要的工作。被警告我只提到这些事情,但不会考虑自己做这样的事情,因为这需要很大的努力,我看不到任何真正的需要。
的问题大致可以理解,但例如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>
这是一个很好的答案。注意:如果你使用的是Spark REPL,这将不起作用,但你可以使用$ intp.allDefinedNames – 2015-02-13 17:15:06
@TristanReid如果没有upvotes,它不会是一个好的答案。根据SO章程,这是不可能的。我认为有必要将Spark REPL带回到REPL文件中,这样他们可以为其他项目提供REPL文件进行扩展。这可能不是这个REPL。 – 2015-02-13 21:08:47
你错了。并非所有优秀的答案都有提升。顺便说一句,感谢这个伟大的答案! – asgs 2016-11-21 17:15:24
- 1. Genshi - 如何打印范围内的所有变量
- 2. 如何列出我的wifi范围内的所有设备iphone
- 3. Scala的变量范围问题
- 4. 范围内的变量
- 5. 函数范围内的变量变量
- 6. 在变量范围内的Perl变量
- 7. 超出范围的变量?
- 8. 如何将变量移出范围?
- 9. Unix shell脚本 - 打印范围内的所有可用变量
- 10. scala内部变量的范围case case guard
- 11. 变量不在范围内
- 12. 循环内变量范围
- 13. 反映方法范围变量的Java
- 14. Java变量超出范围
- 15. MySQL变量超出范围
- 16. 如何查看所有范围变量的内存使用情况
- 17. 如何使范围变量?
- 18. VB .Net 2008 - 列出当前在范围内的所有对象?
- 19. Ansible变量列表范围
- 20. Tensorflow:如何初始化给定变量范围中的所有变量
- 21. 如何范围变量保留所有子程序
- 22. 范围变量
- 23. 变量范围
- 24. 变量范围
- 25. 变量范围
- 26. 变量范围
- 27. 变量范围
- 28. 有没有办法看到当前范围内的所有变量?
- 29. 如何计算全局范围内全局变量的数量?
- 30. 反向地理编码半径范围内的所有地址
的REPL环境中(在此可是可能的)与[Java /运行时]反射通常不同(如果这是不可能的)。 – user2864740 2014-09-01 21:41:56
您需要的是一个可以访问Java完整源代码的工具。斯卡拉不是那种工具。请参阅JavaC编译器,或查看程序转换工具。 – 2014-09-01 22:44:20
我会感谢人们不要修改我问的问题。格式更正很好,澄清很好。但如果你想改变这个问题,请为自己写一个问题。这个问题一般是关于Scala,而不仅仅是REPL。 – 2014-09-01 23:13:56