0520.裝載(import)APIs

import

Scala 'import' 關健字同 Java 用義, 但擁有更多特點, 並且能用於 Scala 任何的地方. - WisdomFish

在 Java 關鍵字 'import' 用來
  1. 帶入除預設載入套件 java.lnag.* 之外的 APIs,
  2. 且必須限定置於文件的最前頭...
Scala 的 'import' 可以用於 Scala 文件內的任何地方,並非只可以用在文件的頂部,這樣就俱備實作最小"作用域"或稱為限制範圍域的關聯性。



萬用符以' _ '取代' * '


與 Java 的一個不同點是,導入一個 Package 中的所有的 classes 時,用的是下劃線 _ 而不是星號 *,這是因為,星號 * 在 Scala 中是一個有效的標識符,比如方法,

def *( )

Ex.
import java.util.*
撰寫成
import java.util._





import 源於特定套件的全部API集



import java.util.ArrayList._

單行式撰寫法
scala> import java.util._, java.io._
import java.util._
import java.io._


Java - static import



_ 在 class 後,
scala> import java.util.ArrayList._
import java.util.ArrayList._





Scala 預先裝載的套件


在預設的情況下, Scala 隱式 import 了下述的套件庫,

import scala._
import java.lang._; // 分號 ; 可省略
// import system._ (.NET)




明確指定 import 目標



scala> import java.util.Locale
import java.util.Locale




限定列舉 import



scala> import java.util.{ Date, Locale }
import java.util.{Date, Locale}



可省略 Scala 首套件


以 scala.xml.Text 為例
scala> import xml.Text
import xml.Text





別名(alias)裝載



scala> import java.util.{ Date => Time }
import java.util.{Date=>Time}

import javax.servlet.http.{HttpServlet,
HttpServletRequest => HSReq, HttpServletResponse => HSResp}



部份除外



scala> import collection.immutable.{Stack => _ , _}
import collection.immutable.{Stack=>_, _}

scala> import collection.immutable.{List => _,_}                 
import collection.immutable.{List=>_, _}




  • 相対import
    • import Map._
    • Liftweb では頻繁に用いられている。twitter, Inc. の内部規約では使用禁止
  • "_root_" package
    • 相対importでの曖昧性を除去するために使用する。
  • final なインスタンスの field, method をインポート
    • class Foo{ def foo(){....}}; val x = (new Foo); import x._


限定作用域 import



scala> class WisdomFish {  
     | import java.util.ArrayList
     | val al = new ArrayList
     | }
defined class WisdomFish

scala> class WisdomFish {       
     | val al = new ArrayList
     | }
defined class WisdomFish





import 單例物件



Ex.
val list = new ArrayList
import list._



Example


import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._

object ChineseDate {
    def main(args: Array[String]) {
        val now = new Date
        val df = getDateInstance(LONG, Locale.CHINA)
        println(df format now)
    }
}

最後這一行展示了scala的語法的一個有趣的地方,只有一個參數的方法,可以用一種嵌入表達方式:

df formate now

這種表達方式只是 df.format(now)的另一種看起來更舒服的寫法。這個看起來只不過是個小小的語法特點,但是卻又一個重要的結果。


import


  • import java.util._
You can import more than one class or object from a single package, for example, TreeMap and TreeSet from the scala.collection.immutable package:

import scala.collection.immutable.{TreeMap, TreeSet}


Finally, you can import a class or object and rename it. For example, you can import the JSON class/object from the scala.util.parsing.json package and rename it to JsonParser:

import scala.util.parsing.json.{JSON => JsonParser}


任 何一種語言都有你喜歡的一面,也有你不是那麼熱衷的一面。Scala給你的最初印象可能確實是符號太多了點,但是你並不需要使用所有的這些符號 ——如果你喜歡的話,你可以繼續沿用很多Java裡的東西。但我想到了那個時候最好還是用符號來實現「特殊任務」以避免標識符衝突。

我 對嵌套的引入聲明不太感冒,使用_root_.java.util..List來把一個」全局「引入和相對引入區別開來。我還更願意使用子引入。 例如,如果你引入了com.acme.cheese.model.Foo,然後,為了引入model.impl.FooImpl,我就更喜歡用一個明確的 相對前綴,就像:import _.impl.FooImpl。這對簡化任務有一些好處,對於保持和Scala的簡潔性就更有幫助了。

References


http://developer.51cto.com/art/200906/130359_1.htm


Comments