欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Scala系列之隱式轉(zhuǎn)換和隱式參數(shù)-創(chuàng)新互聯(lián)

Scala系列之隱式轉(zhuǎn)換和隱式參數(shù)
5.1. 概念
隱式轉(zhuǎn)換和隱式參數(shù)是Scala中兩個(gè)非常強(qiáng)大的功能,利用隱式轉(zhuǎn)換和隱式參數(shù),你可以提供優(yōu)雅的類庫(kù),對(duì)類庫(kù)的使用者隱匿掉那些枯燥乏味的細(xì)節(jié)。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),蒸湘網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:蒸湘等地區(qū)。蒸湘做網(wǎng)站價(jià)格咨詢:18982081108

5.2. 作用
隱式的對(duì)類的方法進(jìn)行增強(qiáng),豐富現(xiàn)有類庫(kù)的功能

object ImplicitDemo extends App{
//定義隱式類,可以把File轉(zhuǎn)換成定義的隱式類RichFile
implicit class RichFile(from:File){
def read:String = Source.fromFile(from.getPath).mkString
}
//使用隱式類做已有類的動(dòng)能的擴(kuò)展
val contents = new File("src/test1.txt").read
println(contents)

}

5.5. 隱式類
創(chuàng)建隱式類時(shí),只需要在對(duì)應(yīng)的類前加上implicit關(guān)鍵字。比如:

object Helpers {
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
}

這個(gè)例子創(chuàng)建了一個(gè)名為IntWithTimes的隱式類。這個(gè)類包含一個(gè)int值和一個(gè)名為times的方法。要使用這個(gè)類,只需將其導(dǎo)入作用域內(nèi)并調(diào)用times方法。比如:

scala> import Helpers.
import Helpers.

scala> 5 times println("HI")
HI
HI
HI
HI
HI

使用隱式類時(shí),類名必須在當(dāng)前作用域內(nèi)可見且無歧義,這一要求與隱式值等其他隱式類型轉(zhuǎn)換方式類似。

只能在別的trait/類/對(duì)象內(nèi)部定義。

object Helpers {
   implicit class RichInt(x: Int) // 正確!
}
implicit class RichDouble(x: Double) // 錯(cuò)誤!

構(gòu)造函數(shù)只能攜帶一個(gè)非隱式參數(shù)。

implicit class RichDate(date: java.util.Date) // 正確!
implicit class Indexer[T](collecton: Seq[T], index: Int) // 錯(cuò)誤!
implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // 正確!

雖然我們可以創(chuàng)建帶有多個(gè)非隱式參數(shù)的隱式類,但這些類無法用于隱式轉(zhuǎn)換。

在同一作用域內(nèi),不能有任何方法、成員或?qū)ο笈c隱式類同名。

object Bar
implicit class Bar(x: Int) // 錯(cuò)誤!

val x = 5
implicit class x(y: Int) // 錯(cuò)誤!

implicit case class Baz(x: Int) // 錯(cuò)誤!

5.6. 隱式轉(zhuǎn)換函數(shù)
是指那種以implicit關(guān)鍵字聲明的帶有單個(gè)參數(shù)的函數(shù),這種函數(shù)將被自動(dòng)引用,將值從一種類型轉(zhuǎn)換成另一種類型。

使用隱含轉(zhuǎn)換將變量轉(zhuǎn)換成預(yù)期的類型是編譯器最先使用 implicit 的地方。這個(gè)規(guī)則非常簡(jiǎn)單,當(dāng)編譯器看到類型X而卻需要類型Y,它就在當(dāng)前作用域查找是否定義了從類型X到類型Y的隱式定義。

比如,通常情況下,雙精度實(shí)數(shù)不能直接當(dāng)整數(shù)使用,因?yàn)闀?huì)損失精度:

scala> val i:Int = 3.5
<console>:7: error: type mismatch;
found : Double(3.5)
required: Int
val i:Int = 3.5
^

當(dāng)然你可以直接調(diào)用 3.5.toInt。

這里我們定義一個(gè)從 Double 到 Int 的隱含類型轉(zhuǎn)換的定義,然后再把 3.5 賦值給整數(shù),就不會(huì)報(bào)錯(cuò)。

scala> implicit def doubleToInt(x:Double) = x toInt
doubleToInt: (x: Double)Int
scala> val i:Int = 3.5
i: Int = 3

此時(shí)編譯器看到一個(gè)浮點(diǎn)數(shù) 3.5,而當(dāng)前賦值語句需要一個(gè)整數(shù),此時(shí)按照一般情況,編譯器會(huì)報(bào)錯(cuò),但在報(bào)錯(cuò)之前,編譯器會(huì)搜尋是否定義了從 Double 到 Int 的隱含類型轉(zhuǎn)換,本例,它找到了一個(gè) doubleToInt。 因此編譯器將把

val i:Int = 3.5

轉(zhuǎn)換成

val i:Int = doubleToInt(3.5)

這就是一個(gè)隱含轉(zhuǎn)換的例子,但是從浮點(diǎn)數(shù)自動(dòng)轉(zhuǎn)換成整數(shù)并不是一個(gè)好的例子,因?yàn)闀?huì)損失精度。 Scala 在需要時(shí)會(huì)自動(dòng)把整數(shù)轉(zhuǎn)換成雙精度實(shí)數(shù),這是因?yàn)樵?Scala.Predef 對(duì)象中定義了一個(gè)

implicit def int2double(x:Int) :Double = x.toDouble

而 Scala.Predef 是自動(dòng)引入到當(dāng)前作用域的,因此編譯器在需要時(shí)會(huì)自動(dòng)把整數(shù)轉(zhuǎn)換成 Double 類型。

5.7. 隱式參數(shù)
object Test{
trait Adder[T] {
def add(x:T,y:T):T
}

implicit val a = new Adder[Int] {
  override def add(x: Int, y: Int): Int = x+y
}

def addTest(x:Int,y:Int)(implicit adder: Adder[Int]) = {
  adder.add(x,y)
}

addTest(1,2) // 正確, = 3
addTest(1,2)(a) // 正確, = 3
addTest(1,2)(new Adder[Int] {
override def add(x: Int, y: Int): Int = x-y
}) // 同樣正確, = -1
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:Scala系列之隱式轉(zhuǎn)換和隱式參數(shù)-創(chuàng)新互聯(lián)
文章地址:http://chinadenli.net/article20/jjdco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google建站公司、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化靜態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
国产女同精品一区二区| 少妇特黄av一区二区三区| 日本精品免费在线观看| 国产午夜福利一区二区| 欧美不卡高清一区二区三区| 日本免费熟女一区二区三区| 国产三级视频不卡在线观看| 国产午夜精品在线免费看| 国产精品欧美一级免费| 久久中文字人妻熟女小妇| 久久热中文字幕在线视频| 噜噜中文字幕一区二区| 亚洲香艳网久久五月婷婷| 色综合久久超碰色婷婷| 成人欧美一区二区三区视频| 欧美尤物在线观看西比尔| 日韩中文无线码在线视频| 五月婷婷欧美中文字幕| 成年人黄片大全在线观看| 久久精品亚洲情色欧美| 国产精品午夜福利免费在线| 国产成人精品午夜福利| 人妻精品一区二区三区视频免精| 老熟妇乱视频一区二区| 香蕉尹人视频在线精品| 欧美色婷婷综合狠狠爱| 欧美日韩国内一区二区| 日本一本在线免费福利| 欧美熟妇喷浆一区二区| 欧美特色特黄一级大黄片| 超碰在线免费公开中国黄片| 精品一区二区三区不卡少妇av| 国产精品美女午夜福利| 中文字幕亚洲视频一区二区| 国产亚州欧美一区二区| 91插插插外国一区二区婷婷| 亚洲精品蜜桃在线观看| 在线观看免费午夜福利| 亚洲男人的天堂久久a| 亚洲免费视频中文字幕在线观看| 性感少妇无套内射在线视频|