Scala 'import' 關健字同 Java 用義, 但擁有更多特點, 並且能用於 Scala 任何的地方. - WisdomFish 在 Java 關鍵字 'import' 用來
- 帶入除預設載入套件 java.lnag.* 之外的 APIs,
- 且必須限定置於文件的最前頭...
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
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