W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
當我們把代碼以層次關系放到包中時,它不僅僅可以幫助人們?yōu)g覽代碼,同時也說明了同一包中的代碼具有某些相關性。Scala 可以利用這些相關性來簡化代碼引用,比較使用短名稱,而無需使用包的全路徑來訪問類定義。
下面我們給出三個簡單的例子:
package bobsrockets{
package navigation{
class Navigator{
var map =new StarMap
}
class StarMap
}
class Ship {
val nav= new navigation.Navigator
}
class fleets{
class Fleet{
def addShip() {new Ship}
}
}
}
在第一個例子中,正如你可以預見的一樣,訪問同一包中定義的類型,無需使用前綴,直接使用類型的名稱即可訪問,也就是本例可以直接使用 new StarMap。類 StarMap 和 Navigator 定義在同一個包中。
第二個例子,嵌套的 package 也可以在其父包中被同級別的其它類型直接訪問,而無需使用全稱,因此第二個例子可以使用 navigation 來直接訪問 navigation 包,而無需添加 bobsrockets。
第三個例子,但使用包定義的{}語法結構時,內層的類型可以直接訪問其外層定義的類型,因此在類 Fleet 中可以直接訪問外層定義的類型 Ship。
要注意的是這種用法只適用于你明確嵌套包定義,如果你采用 Java 語言風格-一個文件定義一個包,那么你只能訪問該包中定義的類型。
訪問包定義的類型還有一個技巧值得說明一下,比如你定義了一些類型之間可能存在相互隱藏的關系,也就是內層定義的同名類型可能會隱藏外層定義的同名類型,那么你怎么來訪問外層定義的類型呢?請看下例:
package launch{
class Booster3
}
package bobsrockets{
package navigtion{
package launch{
class Booster1
}
class MissionControl{
val booster1 =new launch.Booster1
val booster2=new bobsrockets.launch.Booster2
val booster3=new _root_.launch.Booster3
}
}
package launch{
class Booster2
}
}
如何來訪問 Booster1,Booster2,和 Booster3 呢?訪問 Booster1 比較容易,Booster2 可以通過全稱來訪問。那么如何訪問最外層的 Booster3 呢?內層的包 launch 隱藏了這個外部的同名包。為解決這種情況,Scala 提供了_root_,也就是所有最外層的類型都可以當成定義在_root_包中。因此 _root_.launch.Booster3 可以訪問最外層定義的類型。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: