【Scala】Scala的Predef對象

隱式引用(Implicit Import)

Scala會自動為每個程序加上幾個隱式引用漩符,就像Java程序會自動加上java.lang包一樣主到。Scala中桑滩,以下三個包的內(nèi)容會隱式引用到每個程序上为黎。所不同的是臼寄,Scala還會隱式加進對Predef的引用岖是,這極大方便了程序員的工作帮毁。

import java.lang._ // in JVM projects, or system namespace in .NET
import scala._     // everything in the scala package
import Predef._    // everything in the Predef object

上面三個包,包含了常用的類型和方法豺撑。java.lang包包含了常用的java語言類型烈疚,如果在.NET環(huán)境中,則會引用system命名空間前硫。類似的胞得,scala還會隱式引用scala包,也就是引入常用的scala類型。

請注意
上述三個語句的順序藏著一點玄機阶剑。我們知道跃巡,通常,如果import進來兩個包都有某個類型的定義的話牧愁,比如說素邪,同一段程序,即引用了'scala.collection.mutable.Set'又引用了'import scala.collection.immutable.Set'則編譯器會提示無法確定用哪一個Set猪半。這里的隱式引用則不同兔朦,如果有相同的類型,后面的包的類型會將前一個隱藏掉磨确。比如沽甥,java.lang和scala兩個包里都有StringBuilder,這種情況下乏奥,會使用scala包里定義的那個摆舟。java.lang里的定義就被隱藏掉了,除非顯示的使用java.lang.StringBuilder邓了。

Predef對象

Predef提供常用函數(shù)

包scala中的Predef對象包含了許多有用的方法恨诱。例如,Scala源文件中寫下println語句骗炉,實際調(diào)用的是Predef的println照宝,Predef.println轉(zhuǎn)而調(diào)用Console.println,完整真正的工作句葵。

def print(x: Any) = Console.print(x)
def println() = Console.println()
def println(x: Any) = Console.println(x)
def printf(text: String, xs: Any*) = Console.print(text.format(xs: _*))

斷言函數(shù)assert以及相關(guān)函數(shù)也是在Predef中定義的:

/** Tests an expression, throwing an `AssertionError` if false.
*  Calls to this method will not be generated if `-Xelide-below`
*  is at least `ASSERTION`.
*
*  @see elidable
*  @param assertion   the expression to test
*/
@elidable(ASSERTION)
def assert(assertion: Boolean) {
if (!assertion)
  throw new java.lang.AssertionError("assertion failed")
}


/** Tests an expression, throwing an `AssertionError` if false.
*  Calls to this method will not be generated if `-Xelide-below`
*  is at least `ASSERTION`.
*
*  @see elidable
*  @param assertion   the expression to test
*  @param message     a String to include in the failure message
*/
@elidable(ASSERTION) @inline
final def assert(assertion: Boolean, message: => Any) {
if (!assertion)
  throw new java.lang.AssertionError("assertion failed: "+ message)
}

Predef定義類型別名

Predef是一個對象(Object)厕鹃,這個對象中,定義一些類型別名笼呆,如:

scala.collection.immutable.List         // to force Nil, :: to be seen.

type Function[-A, +B] = Function1[A, B]

type Map[A, +B] = immutable.Map[A, B]
type Set[A]     = immutable.Set[A]
val Map         = immutable.Map
val Set         = immutable.Set

現(xiàn)在我們知道了熊响,直接使用集合時,如List诗赌,Map汗茄,Set,用到的是immutable包中的對象铭若,這是在Predef里定義的洪碳。

隱式轉(zhuǎn)換

Predef對象定義了常用的隱式轉(zhuǎn)換,如:

implicit final class any2stringadd[A](private val self: A) extends AnyVal {
  def +(other: String): String = String.valueOf(self) + other
}

該隱式轉(zhuǎn)換叼屠,給AnyVal的所有子類型都加上了+(other: String): String方法瞳腌,便于在打印或其他字符串操作時,加入其他的值類型镜雨。

再如:

@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
@inline implicit def unaugmentString(x: StringOps): String = x.repr

該隱式轉(zhuǎn)換嫂侍,使得我們可以自由的對String使用StringOps的方法。
同理,數(shù)值類型的富包裝(Rich Wrapper)也是這樣實現(xiàn)的挑宠。

Scala程序員可以較少關(guān)心裝箱和拆箱操作菲盾,這也是由于Predef對象里定義了Scala值類型與java基本類型直接的隱式轉(zhuǎn)換。

implicit def byte2Byte(x: Byte)           = java.lang.Byte.valueOf(x)
implicit def short2Short(x: Short)        = java.lang.Short.valueOf(x)
implicit def char2Character(x: Char)      = java.lang.Character.valueOf(x)
implicit def int2Integer(x: Int)          = java.lang.Integer.valueOf(x)
implicit def long2Long(x: Long)           = java.lang.Long.valueOf(x)
implicit def float2Float(x: Float)        = java.lang.Float.valueOf(x)
implicit def double2Double(x: Double)     = java.lang.Double.valueOf(x)
implicit def boolean2Boolean(x: Boolean)  = java.lang.Boolean.valueOf(x)

implicit def Byte2byte(x: java.lang.Byte): Byte             = x.byteValue
implicit def Short2short(x: java.lang.Short): Short         = x.shortValue
implicit def Character2char(x: java.lang.Character): Char   = x.charValue
implicit def Integer2int(x: java.lang.Integer): Int         = x.intValue
implicit def Long2long(x: java.lang.Long): Long             = x.longValue
implicit def Float2float(x: java.lang.Float): Float         = x.floatValue
implicit def Double2double(x: java.lang.Double): Double     = x.doubleValue
implicit def Boolean2boolean(x: java.lang.Boolean): Boolean = x.booleanValue

關(guān)于裝箱(Boxing)和拆箱(Unboxing)
熟悉Java或C#等語言的讀者會知道各淀,裝箱是指將原始類型轉(zhuǎn)換成引用類型(對象)懒鉴,用于需要對象的操作,而拆箱碎浇,則是把對象轉(zhuǎn)換成原始類型临谱,用于需要原始類型的場景。
由于數(shù)值類型本身已經(jīng)是類對象奴璃,因此Scala里不需要裝箱(boxing)和拆箱(unboxing)操作悉默。 當然,Scala代碼最終會運行在JVM上溺健,所以實際上麦牺,始終會有裝箱成Scala類對象,和拆箱成Java原始值類型的操作鞭缭,但是這些操作是透明的,程序員不需要關(guān)心(實際上魏颓,這是由定義在Predef中的隱式轉(zhuǎn)換完成的)岭辣。

參考資料

Predef官方標準庫文檔
隱式引用(Implicit Import)和Predef

轉(zhuǎn)載請注明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甸饱,隨后出現(xiàn)的幾起案子沦童,更是在濱河造成了極大的恐慌,老刑警劉巖叹话,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偷遗,死亡現(xiàn)場離奇詭異,居然都是意外死亡驼壶,警方通過查閱死者的電腦和手機氏豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热凹,“玉大人泵喘,你說我怎么就攤上這事“忝睿” “怎么了纪铺?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碟渺。 經(jīng)常有香客問我鲜锚,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任芜繁,我火速辦了婚禮旺隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浆洗。我一直安慰自己催束,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布伏社。 她就那樣靜靜地躺著抠刺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摘昌。 梳的紋絲不亂的頭發(fā)上速妖,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音聪黎,去河邊找鬼罕容。 笑死,一個胖子當著我的面吹牛稿饰,可吹牛的內(nèi)容都是我干的锦秒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼喉镰,長吁一口氣:“原來是場噩夢啊……” “哼旅择!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣姆,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤生真,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捺宗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柱蟀,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年蚜厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了长已。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡弯囊,死狀恐怖痰哨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匾嘱,我是刑警寧澤斤斧,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站霎烙,受9級特大地震影響撬讽,放射性物質(zhì)發(fā)生泄漏蕊连。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一游昼、第九天 我趴在偏房一處隱蔽的房頂上張望甘苍。 院中可真熱鬧,春花似錦烘豌、人聲如沸载庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚聚。三九已至,卻和暖如春标锄,著一層夾襖步出監(jiān)牢的瞬間顽铸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工料皇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谓松,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓践剂,卻偏偏與公主長得像鬼譬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逊脯,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容