Как использовать членов с уровнем по умолчанию (пакет) или частным уровнем доступа в REPL? - PullRequest
6 голосов
/ 07 октября 2011

Я пытался добавить интерактивности в цикл тестирования / отладки, поэтому я попытался поиграть со своими классами из Scala REPL. Это прекрасно работает, но имеет тот недостаток, что я не могу получить доступ к элементам пакетного и частного уровня, которые можно протестировать с помощью модульного теста (если тест находится в одном пакете).

Могу ли я "установить" пакетный "контекст" Scala REPL?

Полагаю, я мог бы использовать рефлексию для доступа к членам, но это так много печатает, что в первую очередь победит цель использования REPL.

Ответы [ 2 ]

5 голосов
/ 07 октября 2011

Я предполагаю, что класс, который вы тестируете, написан на 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
      }
    }
  }

Предполагая, что это то, что вы делаете часто, вы можете создать файл, который облегчает использование отражения, а затем загрузить его в REPL с помощью команды :load.

1 голос
/ 07 октября 2011

Вы имеете в виду, что не можете получить доступ к членам, определенным в объекте пакета ? Вы можете импортировать этих участников, используя

import mypackage._

или просто получить к ним доступ, используя префиксную форму mypackage.mymember(...).

...