我已经和Scala一起工作了一段时间,并且写了一个超过10,000个的线程程序,但是我仍然对一些内部工作感到困惑。 在和Java,C和Lisp熟悉之后,我来到了Python的Scala,但是即使如此,它也一直很慢,而且一个巨大的问题是我试图调查对象/types的内部工作时经常遇到的令人沮丧的难题/类/等。 与Python相比,使用Scala REPL。 在Python中,您可以使用foo调查任何对象foo (types,全局variables中的对象,内置函数等),以查看该事物的计算结果, type(foo)以显示其types,指示dir(foo)你可以调用它的方法,并help(foo)获取内置的文档。 即使没有与之关联的对象,甚至可以执行诸如help("re")来find名为re的包(包含正则expression式对象和方法)的文档。 在Scala中,您可以尝试在线阅读文档,查看源代码到图书馆等等,但是对于不知道在哪里甚至是在什么地方的东西(通常是很常见的一个庞大的大块咬,考虑到大量的types层次结构) – 东西在各个地方(包scala , Predef ,各种隐式转换,像::这样的符号几乎是不可能的谷歌)浮动。 REPL应该是直接探索的方式,但事实上,事情更加神秘。 假设我已经在某处看到了某个引用,但是我不知道它是什么。 显然没有“用REPL系统地调查Scala东西的指南”这样的东西,但是下面是我经过大量的反复试验后拼凑起来的东西: 如果foo是一个值(大概包含存储在variables加上伴随对象和其他Scala object的东西),那么可以直接评估foo 。 这应该告诉你结果的types和价值。 有时结果是有帮助的,有时候不是。 如果foo是一个值,则可以使用:type foo来获取其types。 (不一定有启发性。)如果你在函数调用中使用它,你将得到返回值的types,而不用调用函数。 如果foo是一个值,你可以使用foo.getClass来获得它的类。 (通常比以前更有启发性,但是一个对象的类与其types有什么不同?) 对于一个类foo ,可以使用classOf[foo] ,虽然结果的含义并不明显。 从理论上讲,你可以使用:javap foo来反汇编一个类 – 这应该是最有用的,但是对于我来说却完全失败了。 有时你必须从错误消息中把东西拼凑起来。 失败的例子使用:javap : scala> :javap List Failed: Could not find class bytes for 'List' 启发错误信息示例: scala> assert <console>:8: error: ambiguous reference […]