gpt4 book ai didi

java - Scala如何处理Java风格的包语句

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:49:19 25 4
gpt4 key购买 nike

这听起来很尴尬。我的目的是了解 Scala 如何处理以 Java 风格编写的包语句。为此,我编写了一个小示例类(我将其命名为 DinnerTimeP.scala,如下所示:

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

我有一个名为 scaladev 的文件夹,我在该文件夹下创建了包文件夹 dinnertime。在这个包下有 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

我希望在 dinnertime 文件夹下找到生成的 Dinner.class,它位于源文件 DinnerTimeP.scala 旁边。为了确认我的理解,我在同一文件夹下创建了一个 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\dinnertime>javac HelloWorld.java

HelloWorld.class 文件是在其源文件旁边生成的。这正是我希望在 Scala 源文件及其编译文件中看到的确切情况。相反,我在包文件夹晚餐时间看到了一个由 Scala 生成的新包文件夹。

这可能很天真。我可能背叛了对 Scala 和包的基本理解,但我对这种行为感到困惑。这是我无法向自己解释的问题:为什么要为新生成的类文件创建嵌套包。这是我希望通过自己的真诚努力解决的问题 因为我目前使用 Scala 的经验有限,所以我求助于 stackoverflow 上的 Scala 专家来帮助我了解发生了什么以及为什么?这个嵌套包是由 Scala 而不是 Java 创建的原因吗?

最佳答案

Tomasz explained让它工作所需的一切,所以让我解释一下原因。

Scala 不要求源文件位于反射(reflect)包的目录层次结构中。也就是说,Dinner.scala 可以在任何地方:这根本不重要。

而且,要真正清楚,即使您有一个复杂的包层次结构,很深并且每个级别都有多个子包,您也可以将所有源文件放在一个目录中。 Scala 文件所在的目录不相关

很抱歉这么强调它,但是来自 Java 可能很难理解这一点。

好的,现在,如何解释dinnertime/Dinner.class?好吧,JVM 要求将类文件放在与包名称相对应的目录层次结构中,因此即使 Scala 源文件可以放在任意目录中,scalac 也必须生成一个目录结构反射(reflect)包名。

因此,为了检查所有内容,Scala 不关心您在哪个目录中,因此它忽略了您在名为 dinnertime 的目录中这一事实。但是,由于源代码表明该类位于名为 dinnertime 的包中,因此它创建了这样的目录并将类文件放入其中。它假定当前目录的基础是当前目录,可以根据 Tomasz 的回答使用 -d 参数进行更改。

关于java - Scala如何处理Java风格的包语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com