gpt4 book ai didi

scala - 与简单的 Scala 打包示例混淆

转载 作者:行者123 更新时间:2023-12-02 08:58:08 48 4
gpt4 key购买 nike

我一直对 Scala 中的打包类和导入包感到困惑。让我从一对简单的源文件开始:

文件:a/A.scala

package a

// Which of these imports should be used? They both seem to work.
//import a.b._
import b._

class A {
val fieldB = new B
}

文件:a/b/B.scala

package a.b

class B

用法

使用 scalac 进行编译,不会对 A.scala 中的上述任何导入产生提示

尝试在 REPL 中加载这些文件的工作方式有所不同:

$ scala
Welcome to Scala version 2.8.0.r0-b20100714201327 (Java HotSpot(TM) Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :l a/b/B.scala
Loading a/b/B.scala...
<console>:1: error: illegal start of definition
package a.b
^
defined class B

scala> :l a/A.scala
Loading a/A.scala...
<console>:1: error: illegal start of definition
package a
^
<console>:5: error: not found: value b
import b._
^
defined class A

scala>

所以,我有一些问题:

  • 在上面的 A.scala 中进行导入的正确方法是什么?

  • 编译器似乎能够确定导入是相对于我们所在的包还是绝对的,无需 _root_。这就是我所看到的吗?

  • 我在 REPL 中这样做正确吗?为什么它看起来对 package 语句如此不满意,为什么 import b._ 会生成错误?

谢谢

PS 我知道目录结构不必与包装相匹配。自愿这样做可以帮助我暂时减少困惑。

最佳答案

首先,您不能在 REPL 中定义包。原因是您的 REPL 语句实际上被包装到对象中。这就是您的 :load 命令失败的原因。如果您想使用包,您需要编译源文件并将其添加到类路径中。

当尝试解析要导入的符号时,编译器会尝试在您的实际范围内找到它,即当您编写时

import a._
import b._

这将导入包a中的所有内容以及包a.b中的所有内容。如果您位于 package a 内,则 b 已在您的范围内,第二次导入就足够了。编译器最初还会导入 scala._,因此您还可以使用相对导入(例如 import xml._)来导入 scala.xml._

此外,还有一个称为嵌套包的功能,可以让您像这样编写 B.scala

package a
package b
class B { /* .... */ }

这会导致 package a 中的所有内容都导入到此文件中。

如果编译器无法解析相对符号的导入,它将在默认包 (_root_) 中查找。

关于scala - 与简单的 Scala 打包示例混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3335708/

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