鍍金池/ 教程/ Scala/ 引用包中的代碼
包對(duì)象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對(duì)象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對(duì)象 (二)
組合和繼承–定義 factory 對(duì)象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡(jiǎn)化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問(wèn)控制修飾符
Trait 示例–Rectangular 對(duì)象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無(wú)參數(shù)方法
類和對(duì)象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問(wèn)控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對(duì)象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對(duì)象 (四)
函數(shù)–尾遞歸
沒(méi)有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開(kāi)始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來(lái)實(shí)現(xiàn)可疊加的修改操作

引用包中的代碼

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

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

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ù)見(jiàn)的一樣,訪問(wèn)同一包中定義的類型,無(wú)需使用前綴,直接使用類型的名稱即可訪問(wèn),也就是本例可以直接使用 new StarMap。類 StarMap 和 Navigator 定義在同一個(gè)包中。

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

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

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

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

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

如何來(lái)訪問(wèn) Booster1,Booster2,和 Booster3 呢?訪問(wèn) Booster1 比較容易,Booster2 可以通過(guò)全稱來(lái)訪問(wèn)。那么如何訪問(wèn)最外層的 Booster3 呢??jī)?nèi)層的包 launch 隱藏了這個(gè)外部的同名包。為解決這種情況,Scala 提供了_root_,也就是所有最外層的類型都可以當(dāng)成定義在_root_包中。因此 _root_.launch.Booster3 可以訪問(wèn)最外層定義的類型。