【问题标题】:How to use members with default (package) or private access level in REPL?如何在 REPL 中使用具有默认(包)或私有访问级别的成员?
【发布时间】:2011-10-07 09:54:47
【问题描述】:

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

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

我想我可以使用反射来访问成员,但是输入太多会破坏首先使用 REPL 的目的。

【问题讨论】:

    标签: scala read-eval-print-loop


    【解决方案1】:

    我假设您正在测试的类是用 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
          }
        }
      }
    

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

    【讨论】:

      【解决方案2】:

      您的意思是您不能访问package object 中定义的成员?您可以使用

      导入这些成员
      import mypackage._
      

      或者简单地使用前缀形式mypackage.mymember(...)访问它们。

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 2017-12-22
        • 2014-10-27
        • 1970-01-01
        • 2011-09-28
        • 2012-12-20
        相关资源
        最近更新 更多