2011-10-07 4 views
6

필자는 테스트/디버그 사이클에 몇 가지 상호 작용 기능을 추가하려고 했으므로 Scala REPL의 클래스를 가지고 놀아 보았습니다. 이것은 훌륭하게 작동하지만 단원 테스트 (동일한 패키지에있는 경우)에서 테스트 할 수있는 패키지 수준 및 개인 수준 멤버에 액세스 할 수 없다는 단점이 있습니다.REPL에서 기본 (패키지) 또는 개인 액세스 수준의 멤버를 사용하는 방법은 무엇입니까?

Scala REPL의 패키지 "컨텍스트"를 "설정"할 수 있습니까?

나는 리플렉션을 사용하여 멤버에 액세스 할 수 있다고 생각하지만, 그렇게 많이 입력하면 REPL을 처음 사용하는 목적을 무효화합니다.

답변

1

package object에 정의 된 멤버에 액세스 할 수 없다는 의미입니까? 당신은

import mypackage._ 

또는 단순히 접두사 형태 mypackage.mymember(...)를 사용하여 액세스 사용하여 이러한 멤버를 가져올 수 있습니다.

5

스칼라에서 패키지 전용 멤버를 만드는 방법을 벗어나면 테스트 할 클래스가 Java로 작성되었다고 가정합니다.

간단히 말해서 불가능합니다. 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에로드하십시오.