2012-07-19 5 views
3

이것은 당황 스럽습니다. 필자의 목적은 스칼라가 Java 스타일로 작성된 패키지 문을 처리하는 방법을 이해하는 것이다. 이를 위해, 나는 다음과 같이 DinnerTimeP.scala라는 것을 (약간의 예를 들어 클래스를 썼다. 나는 패키지 폴더를 생성 한 아래 scaladev라는 폴더, 저녁 식사를스칼라가 Java 스타일 패키지 문을 처리하는 방법

package dinnertime 
class Dinner { 
    val veggie = "broccoli" 
    def announceDinner(veggie: String) { 
    println("Dinner happens to be tasteless " + veggie + " soup") 
    } 
} 

을이 패키지의 삶에서 DinnerTimeP.scala는. DOS 명령에 나는 다음 아래 scalac로 (이름이 바보 소리) 저녁 식사로 이동하여 파일 DinnerTimeP을 컴파일합니다.

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>set CLASSPATH=.;C:\scala- 2.9.1.final\scala-2.9.1.final\scaladev 

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>scalac DinnerTimeP.scala 
내가 Dinner.class 바로 저녁 식사 폴더 아래에 생성 찾을 기대했다

소스 파일 DinnerTimeP.scala 옆에 앉아. 내 이해를 확인하기 위해 HelloWorld 동일한 폴더에있는 .java 프로그램은 다음과 같이

package dinnertime; 

public class HelloWorld { 
    public static void main(String[] args) { 
    System.out.println("Hello World"); 
} 

}

I 명령 라인 HelloWorld.java 컴파일 : C : \ scala-2.9.1.final \ 스칼라 2.9.1. final \ scaladev \ dinnertime> javac HelloWorld.java

HelloWorld.class 파일은 소스 파일 바로 옆에 생성되었습니다. 이것은 스칼라 소스 파일과 컴파일 된 파일을보고 싶었던 정확한 상황이었습니다. 대신 패키지 폴더 dinnertime 내에 스칼라에 의해 생성 된 새 패키지 폴더가 표시됩니다.

이것은 순진 할 수도 있습니다. 스칼라와 패키지에 대한 근본적인 이해를 배반했을 지 모르지만, 나는이 동작에 당혹 스러웠다. 이것은 나 자신에게 설명 할 수없는 문제입니다. 새로 생성 된 클래스 파일에 대해 중첩 된 패키지가 만들어지는 이유는 무엇입니까? 이것은 내 자신의 성실한 노력에 기초하여 내가 풀기를 바랐던 문제이다. 현재 스칼라에 대한 나의 경험이 제한되어 있으므로, 스칼라 전문가에게 stackoverflow에 무슨 일이 일어나는지 알 수 있도록 도움을 요청했다. 왜? Java가 아닌 Scala에서이 중첩 패키지를 만들 이유가 있습니까? 모든 루트 디렉토리에서 컴파일 시도의

답변

5

Tomaszexplained 모든이 작업을 얻을, 왜 나를 설명하자 : 당신은 쉽게 -d 매개 변수를 사용하여이 문제를 해결할 수 있습니다.

스칼라에서는 원본 파일이 패키지를 반영하는 디렉터리 계층에 있어야한다는 것을 요구하지 않습니다.즉, Dinner.scala일 수 있으며, 어디에도 일 수 있습니다. 간단히 말해서 중요하지 않습니다.

복잡한 패키지 계층 구조를 가지고 있더라도 각각의 레벨에 여러 하위 패키지가있는 경우 모든 소스 파일을 단일 디렉토리에 넣을 수 있습니다. Scala 파일이 들어있는 디렉토리는 과 관련이 없습니다..

죄송합니다. 너무 많은 강조를 해 주셔서 죄송합니다.하지만 자바에서 오는 것은 이것을 파악하기 어려울 수 있습니다.

이제는 설명하는 방법 dinnertime/Dinner.class? 음, JVM은 클래스 파일을 패키지 이름에 해당하는 디렉토리 계층 구조에 넣으 려하므로 Scala 소스 파일을 임의의 디렉토리에 둘 수 있더라도 scalac은 디렉토리 구조가 패키지 이름을 반영하는 출력을 생성해야합니다.

그래서 모든 것을 검토하기 위해 Scala는 사용자가 어떤 디렉토리에 있는지 신경 쓰지 않으므로 dinnertime이라는 디렉토리에 있다는 사실을 무시했습니다. 그러나 소스 코드는 클래스가 dinnertime이라는 패키지에 있음을 나타 냈으므로 클래스를 작성하고 클래스 파일을 넣습니다. 그것은 토마 즈 (Tomasz) 응답에 따라 -d 매개 변수로 변경할 수있는 현재 디렉토리라고 가정했습니다.

+0

나는 그것을 모두 본다. 이것은 매우 유용한 정보입니다. 나는 굉장한 피드백과 당신이 물건을 설명하기 위해 넣는 모든 노력에 감사한다. – ilango

5

첫째, 하위 디렉토리 dinnertime 있도록 :

$ javac dinnertime/HelloWorld.java 

과 :

$ scalac dinnertime/Dinner.scala 

그들은 모두 두 경우 모두 .class 파일을 즉, 동일한 출력을 생성 하위 디렉토리 dinnertime에 위치합니다.

차이점은 패키지 내에서 컴파일러를 실행할 때 발생합니다. javac은 현재 디렉토리가 아닌 루트 디렉토리를 기준으로 대상 바이너리 파일을 저장할 정도로 똑똑합니다. 항상 현재 디렉토리를 기본으로 사용하는 scalac의 경우는 아닙니다. 당신이 필요로하는

$ cd dinnertime 
$ scalac -d .. Dinner.scala 
+0

분명히 설명했습니다. 그것은 효과가 있었다. – ilango

+0

scalac -d를 실행했습니다. C : \ scala-2.9.1.final \ scala-2.9.1.final \ scaladev \ dinnertime> scalac -d DinnerTimeP.scala scalac 오류 : DinnerTimeP.scala 않습니다. 존재하지 않거나 디렉토리가 아닙니다. 내가하는 일에 뭔가 이상한 것처럼 보입니다. – ilango

+0

@ilangogurusamy :'-d'는 어떤 인자를 요구합니다 :'scalac -d some/dir DinnerTimeP.scala' –