Scala 引用包中的代碼

2018-09-28 18:18 更新

引用包中的代碼

當我們把代碼以層次關系放到包中時,它不僅僅可以幫助人們?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 可以訪問最外層定義的類型。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號