Scala如何处理Java风格的包语句
这听起来很尴尬。我的目的是了解Scala如何处理用Java风格编写的包语句。为此,我编写了一个小示例类(我将其命名为DinnerTimeP.scala,如下所示:Scala如何处理Java风格的包语句,java,scala,packages,scalac,Java,Scala,Packages,Scalac,这听起来很尴尬。我的目的是了解Scala如何处理用Java风格编写的包语句。为此,我编写了一个小示例类(我将其命名为DinnerTimeP.scala,如下所示: package dinnertime class Dinner { val veggie = "broccoli" def announceDinner(veggie: String) { println("Dinner happens to be tasteless " + veggie + " soup")
package dinnertime
class Dinner {
val veggie = "broccoli"
def announceDinner(veggie: String) {
println("Dinner happens to be tasteless " + veggie + " soup")
}
}
我有一个名为scaladev的文件夹,在这个文件夹下我创建了包文件夹dinnertime。在这个包下有DinnerTimeP.scala。在DOS命令下,我导航到dinnertime并用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
我希望找到在dinnertime文件夹下生成的、位于源文件DinnerTimeP.scala旁边的Dinner.class。
为了确认我的理解,我在同一文件夹下创建了一个HelloWorld.java程序:
package dinnertime;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
我在命令行上编译了HelloWorld.java,如下所示:
C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dintertime>javac HelloWorld.java
HelloWorld.class文件是在其源文件旁边生成的。
这正是我想看到的Scala源文件及其编译文件的情况。
相反,我看到一个由Scala生成的新包文件夹在包文件夹dinnertime中
这可能很幼稚,我可能背叛了对Scala和包的基本理解,但我对这种行为感到困惑。
这是我无法向自己解释的问题:为什么要为新生成的类文件创建嵌套包。这是我希望在自己真诚努力的基础上解决的问题
因为我目前使用Scala的经验有限,所以我求助于询问stackoverflow上的Scala大师,以帮助我了解发生了什么以及为什么?
是否有理由使用Scala而不是Java创建此嵌套包?首先尝试从根目录编译,以便
晚餐时间
是一个子目录:
$ javac dinnertime/HelloWorld.java
以及:
它们都产生相同的输出,即在这两种情况下。class
文件放在晚餐时间
子目录下
当您在包中运行编译器时,会出现这种差异。事实证明,javac
足够聪明,可以将目标二进制文件相对于根目录而不是当前目录放置。scalac的情况并非如此,它始终使用当前目录作为基础。您可以通过使用-d
参数轻松解决此问题:
$ cd dinnertime
$ scalac -d .. Dinner.scala
让它工作所需的一切,让我解释一下原因
Scala并不要求源文件位于反映包的目录层次结构中。也就是说,晚餐。Scala可以在任何地方:这根本不重要
而且,更清楚的是,即使您有一个复杂的包层次结构,很深,并且每个级别都有多个子包,您也可以将所有源文件放在一个目录中。放Scala文件的目录并不相关
很抱歉这么强调它,但是来自Java,可能很难理解这一点
好的,现在,如何解释晚餐时间/Dinner.class
?好的,JVM要求将类文件放在与包名相对应的目录层次结构中,因此即使Scala源文件可以放在任意目录中,scalac也必须生成一个目录结构反映包名的输出
因此,为了查看所有内容,Scala不关心您在哪个目录中,因此它忽略了您在名为dinnertime
的目录中这一事实。然而,由于源代码表明该类位于名为dinnertime
的包中,它创建了这样的目录并将类文件放在其中。它假定了该目录的基础是当前目录,根据Tomasz的回答,可以使用-d
参数进行更改。我刚刚运行了scalac-d这是我所做的:C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>scalac-d dinnertime.scala scala错误:dinnertime.scala不存在或不是某个不存在的目录“我所做的似乎不正确。@ilangogurusamy:-d
需要一些参数:scalac-d some/dir dintertimep.scala
更新:有效。我对..很好奇,起初我忽略了它并运行了scalac-d,但当我用..尝试它时,它成功了。这太棒了。Daniels和你的答案都非常准确。”我无法接受。因此两者都是正确的。但我无法为两者设置正确的答案。@ilangogurusamy:没问题,很高兴我们能提供帮助!我现在都看到了。这是非常有用的信息。我感谢您的反馈以及您为解释这些内容所付出的辛勤工作。
$ cd dinnertime
$ scalac -d .. Dinner.scala