Scala 引用包中的代碼

2018-09-28 18:18 更新

引用包中的代碼

當(dāng)我們把代碼以層次關(guān)系放到包中時(shí),它不僅僅可以幫助人們?yōu)g覽代碼,同時(shí)也說明了同一包中的代碼具有某些相關(guān)性。Scala 可以利用這些相關(guān)性來簡化代碼引用,比較使用短名稱,而無需使用包的全路徑來訪問類定義。

下面我們給出三個(gè)簡單的例子:

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

在第一個(gè)例子中,正如你可以預(yù)見的一樣,訪問同一包中定義的類型,無需使用前綴,直接使用類型的名稱即可訪問,也就是本例可以直接使用 new StarMap。類 StarMap 和 Navigator 定義在同一個(gè)包中。

第二個(gè)例子,嵌套的 package 也可以在其父包中被同級別的其它類型直接訪問,而無需使用全稱,因此第二個(gè)例子可以使用 navigation 來直接訪問 navigation 包,而無需添加 bobsrockets。

第三個(gè)例子,但使用包定義的{}語法結(jié)構(gòu)時(shí),內(nèi)層的類型可以直接訪問其外層定義的類型,因此在類 Fleet 中可以直接訪問外層定義的類型 Ship。

要注意的是這種用法只適用于你明確嵌套包定義,如果你采用 Java 語言風(fēng)格-一個(gè)文件定義一個(gè)包,那么你只能訪問該包中定義的類型。

訪問包定義的類型還有一個(gè)技巧值得說明一下,比如你定義了一些類型之間可能存在相互隱藏的關(guān)系,也就是內(nèi)層定義的同名類型可能會隱藏外層定義的同名類型,那么你怎么來訪問外層定義的類型呢?請看下例:

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 呢?內(nèi)層的包 launch 隱藏了這個(gè)外部的同名包。為解決這種情況,Scala 提供了_root_,也就是所有最外層的類型都可以當(dāng)成定義在_root_包中。因此 _root_.launch.Booster3 可以訪問最外層定義的類型。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號