如何在REPL中使用具有默认(包)或私有访问级别的成员?

Mic*_*ski 6 scala read-eval-print-loop

我试图在我的测试/调试周期中添加一些交互性,所以我尝试使用Scala REPL中的类.这很好用,但缺点是我无法访问可以从单元测试中测试的包级和私有级成员(如果测试在同一个包中).

我可以"设置"Scala REPL的包"上下文"吗?

我想我可以使用反射来访问成员,但是这样输入它会破坏首先使用REPL的目的.

huy*_*hjl 5

我假设您正在测试的类是用Java编写的,因为您必须不遗余力地在Scala中创建仅包成员.

简而言之,这是不可能的.REPL中的每一行都包含在它自己的包中,因此不允许从任何其他包访问另一个仅包的成员.即使有一个未记录的系统属性来更改用于换行的默认包名称前缀,仍然会通过递增一个数字来自动生成包名称:

$ scala -Xprint:parser -Dscala.repl.naming.line=foo.line
scala> val x = 1
[[syntax trees at end of parser]]// Scala source: <console>
package foo.line1 {
  object $read extends scala.ScalaObject {
    // snip ...
    object $iw extends scala.ScalaObject {
      // snip ...
      object $iw extends scala.ScalaObject {
        // snip ...
        val x = 1
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

假设这是您经常做的事情,您可以做的是创建一个文件,使反射易于使用,然后使用:load命令将其加载到REPL中.


Phi*_*ppe 1

您的意思是您无法访问包对象中定义的成员吗?您可以使用导入这些成员

import mypackage._
Run Code Online (Sandbox Code Playgroud)

或者直接使用前缀 form 来访问它们mypackage.mymember(...)