本篇內(nèi)容主要講解“Scala的Predef對(duì)象有什么作用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Scala的Predef對(duì)象有什么作用”吧!
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到荊州網(wǎng)站設(shè)計(jì)與荊州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋荊州地區(qū)。
Scala會(huì)自己主動(dòng)為每一個(gè)程序加上幾個(gè)隱式引用,就像Java程序會(huì)自己主動(dòng)加上java.lang包一樣。
Scala中。下面三個(gè)包的內(nèi)容會(huì)隱式引用到每一個(gè)程序上。所不同的是。Scala還會(huì)隱式加進(jìn)對(duì)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
上面三個(gè)包,包括了經(jīng)常使用的類型和方法。java.lang包包括了經(jīng)常使用的java語(yǔ)言類型,假設(shè)在.NET環(huán)境中,則會(huì)引用system命名空間。相似的,scala還會(huì)隱式引用scala包,也就是引入經(jīng)常使用的scala類型。
請(qǐng)注意
上述三個(gè)語(yǔ)句的順序藏著一點(diǎn)玄機(jī)。我們知道,通常,假設(shè)import進(jìn)來(lái)兩個(gè)包都有某個(gè)類型的定義的話,比方說(shuō),同一段程序。即引用了’scala.collection.mutable.Set’又引用了’import scala.collection.immutable.Set’則編譯器會(huì)提示無(wú)法確定用哪一個(gè)Set。這里的隱式引用則不同,假設(shè)有同樣的類型。后面的包的類型會(huì)將前一個(gè)隱藏掉。比方。java.lang和scala兩個(gè)包里都有StringBuilder。這樣的情況下,會(huì)使用scala包里定義的那個(gè)。java.lang里的定義就被隱藏掉了,除非顯示的使用java.lang.StringBuilder。
包scala中的Predef對(duì)象包括了很多實(shí)用的方法。比如,Scala源文件里寫下println語(yǔ)句,實(shí)際調(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是一個(gè)對(duì)象(Object)。這個(gè)對(duì)象中,定義一些類型別名。如:
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
如今我們知道了。直接使用集合時(shí),如List。Map。Set。用到的是immutable包中的對(duì)象。這是在Predef里定義的。
Predef對(duì)象定義了經(jīng)常使用的隱式轉(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
方法,便于在打印或其它字符串操作時(shí),增加其它的值類型。
再如:
@inline implicit def augmentString(x: String): StringOps = new StringOps(x) @inline implicit def unaugmentString(x: StringOps): String = x.repr
該隱式轉(zhuǎn)換,使得我們能夠自由的對(duì)String使用StringOps的方法。
同理,數(shù)值類型的富包裝(Rich Wrapper)也是這樣實(shí)現(xiàn)的。
Scala程序猿能夠較少關(guān)心裝箱和拆箱操作,這也是因?yàn)镻redef對(duì)象里定義了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#等語(yǔ)言的讀者會(huì)知道,裝箱是指將原始類型轉(zhuǎn)換成引用類型(對(duì)象)。用于須要對(duì)象的操作,而拆箱,則是把對(duì)象轉(zhuǎn)換成原始類型,用于須要原始類型的場(chǎng)景。
因?yàn)閿?shù)值類型本身已經(jīng)是類對(duì)象,因此Scala里不須要裝箱(boxing)和拆箱(unboxing)操作。
當(dāng)然,Scala代碼終于會(huì)執(zhí)行在JVM上,所以實(shí)際上,始終會(huì)有裝箱成Scala類對(duì)象,和拆箱成Java原始值類型的操作,可是這些操作是透明的,程序猿不須要關(guān)心(實(shí)際上,這是由定義在Predef中的隱式轉(zhuǎn)換完畢的)。
到此,相信大家對(duì)“Scala的Predef對(duì)象有什么作用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!