代码之家  ›  专栏  ›  技术社区  ›  dino

与简单的Scala打包示例混淆

  •  2
  • dino  · 技术社区  · 14 年前

    我在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_ . 这就是我看到的吗?

    • import b._ 生成错误?

    谢谢你

    我知道目录结构不必与包装匹配。主动这样做有助于我现在不那么困惑。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Moritz    14 年前

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

    import a._
    import b._
    

    这将从 package a package a.b . 如果你在里面 a包 b 已经在您的范围内,第二次导入就足够了。 编译器最初也会导入 scala._ import xml._ 导入 scala.xml._

    此外,还有一个名为嵌套包的功能,可以让您编写 B.scala 喜欢

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

    结果是 正在导入此文件。

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

        2
  •  0
  •   Langley    9 年前

    要从控制台加载类。。。

    scala> :paste -raw io/hacking/yourpackage/YourClass.scala

    如果您的类有一个main,则可以使用以下命令调用它:

    scala> io.hacking.yourpackage/YourClass.main(Array())

    推荐文章