为什么我的对象不是包的成员 如果它在单独的源文件中?

问题描述 投票:18回答:3

我在访问根包中定义的对象时遇到问题。如果我将所有代码都放在一个文件中,则可以正常工作,但是当我将其拆分为两个文件时,就无法通过编译器。

这很好用:

全部称为packages.scala的一个文件:

object Foo
  val name = "Brian"
}

package somepackage {
  object Test extends App {
    println(Foo.name)
  }
}

见证:

$ scalac packages.scala
$ scala -cp . somepackage.Test
Brian

但是如果我将代码分成两个文件:

packages.scala

object Foo {
  val name = "Brian"
}

packages2.scala

package somepackage {
  object Test extends App {
    println(Foo.name)
  }
}

全部失败:

$ scalac packages.scala packages2.scala
packages2.scala:3: error: not found: value Foo

所以我尝试将对Foo的引用设为绝对:

...
    println(_root_.Foo.name)
...

但是那也不起作用:

$ scalac packages.scala packages2.scala
packages2.scala:3: error: object Foo is not a member of package <root>

如果Foo不是根包的成员,那么是]在哪里?

我在访问根包中定义的对象时遇到问题。如果我将所有代码都放在一个文件中,则可以正常工作,但是当我将其拆分为两个文件时,就无法通过编译器。这个...

scala packages
3个回答
28
投票

我认为这是规范中的相关部分:


20
投票

Foo是root软件包的成员,但是您不能引用它。这是JVM语言的通用特性(对于Groovy,请参见How to access java-classes in the default-package?What's the syntax to import a class in a default package in Java?)。与Scala相同。


0
投票

尝试将主App入口点导入测试时,请执行此操作。这可能是一个恶作剧,但是将package scala放在入口点定义的顶部似乎使该对象全局可用。这可能是邪恶的,但有效。

© www.soinside.com 2019 - 2024. All rights reserved.