【问题标题】:Scala package delcaration - one way causes package objects visible, other makes it not?Scala package declaration - 一种方式导致包对象可见,其他方式使其不可见?
【发布时间】:2011-04-21 21:40:08
【问题描述】:

在foo/bar/my_package/package.scala:

package foo.bar
package object my_package {
  type SomeType = java.lang.String
}

然后,在foo/bar/my_package/my_sub/MyClass.scala

package foo.bar.my_package.my_sub

class MyClass {
  var x: SomeType = _
}

编译失败;找不到SomeType。如果我将MyClass.scala 更改为

package foo.bar.my_package
package my_sub

class MyClass {
  var x: SomeType = _
}

一切正常。有什么区别!?!??!

(这是 Scala 2.8.1)

【问题讨论】:

    标签: scala package


    【解决方案1】:

    包声明,如导入,让您可以访问其中的所有内容。所以当你

    package foo.bar.my_package
    

    如果你这样做了,你就会拥有一切可用的东西

    import foo.bar.my_package._
    

    此外,在一行中声明一个包意味着下面的所有内容都属于该包:

    package foo.bar.my_package {
      package my_sub {
        class MyClass { var x: SomeType = _ }
      }
    }
    

    (相当于:

    package foo.bar.my_package
    package my_sub
    class MyClass { var x: SomeType = _ }
    

    )

    所以你可以看到foo.bar.my_package 的内容在这种情况下应该如何在范围内。在另一种情况下,您只有foo.bar.my_package.my_sub 的内容可用,不包括SomeType。

    【讨论】:

    • 请注意,在我的第二个示例中,我没有使用花括号来表示包装内容;这只是暗示吗?
    • @davetron5000 这不是暗示,它只是同一事物的两种不同语法。 Rex 使用花括号来明确my_sub 在foo.bar.my_package 内部。然而,重要的一点是 package 声明会在此时导入所有内容。
    • 编辑了答案以明确这一点。如果没有人对我的编辑有任何疑问,我会选择此作为“正确答案”
    【解决方案2】:

    这是一个可见性问题。

    package foo.bar.my_package.my_sub
    
    class MyClass {
      var x: SomeType = _
    }
    

    当你声明x时,下面的东西是可见的:

    • MyClass的每个成员
    • 里面的一切foo.bar.my_package.my_sub
    • scala.Predef的每个成员
    • 里面的一切scala
    • java.lang 里面的所有东西

    SomeType 类型不在其中。

    另一方面,当你这样做时:

    package foo.bar.my_package
    package my_sub
    
    class MyClass {
      var x: SomeType = _
    }
    

    那么可见性是:

    • MyClass的每个成员
    • 里面的一切foo.bar.my_package.my_sub
    • 里面的一切foo.bar.my_package
    • scala.Predef的每个成员
    • 里面的一切scala
    • 里面的一切java.lang

    而SomeType 在foo.bar.my_package 里面,也就是第二行。

    一个相关的问题是它为什么会这样工作。你可以开始here,尽管有一个关于that 的问题。不过,我不太喜欢这个问题的答案,因为它确实没有触及它的原因。它在 scala-lang 上 link to a page 关于 Scala 2.8 的新特性,其中 Odersky 解释了原因。

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 2011-08-17
      • 2016-08-01
      • 1970-01-01
      • 2015-03-18
      • 2015-03-06
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多