2011-04-21 43 views
4

foo/bar/my_package/package.scalaScala包的分解 - 一種方式導致包對象可見,另一種使它不可用?

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 = _ 
} 

一切正常。有什麼不同!?!??!

(這是斯卡拉2.8.1)

回答

5

包聲明,進口一樣,給你訪問裏面他們的一切。所以,當你

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

+0

請注意,在我的第二個示例中,我沒有使用大括號包裝的東西;這只是暗示? – davetron5000 2011-04-22 13:39:00

+0

@ davetron5000這並不是暗示,對於同樣的事物,它只是兩種不同的語法。 Rex使用花括號來說明'my_sub'在'foo.bar.my_package'裏面。然而,重要的一點是'package'聲明在這一點上導入了所有的東西。 – 2011-04-22 16:42:21

+0

編輯答案,以明確。如果沒有人對我的編輯有任何問題,我會選擇這個作爲「正確答案」。 – davetron5000 2011-04-25 17:02:00

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 = _ 
} 

然後能見度:

  • foo.bar.my_package
  • MyClass
  • 裏面的一切foo.bar.my_package.my_sub
  • 一切的每個成員的每個成員
  • 一切內部scala
  • 一切內部java.lang

而且SomeType是內部foo.bar.my_package,這是第二行。

一個相關的問題是爲什麼它以這種方式工作。你可以得到一個開始here,雖然有一個精確的問題關於that。但我不太喜歡這個問題的答案,因爲它確實沒有涉及到它的原因。它在關於Scala 2.8的新特性的scala-lang上做了link to a page,其中Odersky解釋了原因。

相關問題