敏捷硬件開(kāi)發(fā)語(yǔ)言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第19章 隱式轉(zhuǎn)換與隱式參數(shù)_第1頁(yè)
敏捷硬件開(kāi)發(fā)語(yǔ)言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第19章 隱式轉(zhuǎn)換與隱式參數(shù)_第2頁(yè)
敏捷硬件開(kāi)發(fā)語(yǔ)言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第19章 隱式轉(zhuǎn)換與隱式參數(shù)_第3頁(yè)
敏捷硬件開(kāi)發(fā)語(yǔ)言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第19章 隱式轉(zhuǎn)換與隱式參數(shù)_第4頁(yè)
敏捷硬件開(kāi)發(fā)語(yǔ)言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第19章 隱式轉(zhuǎn)換與隱式參數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

19.隱式轉(zhuǎn)換與隱式參數(shù)一、隱式定義的含義及規(guī)則二、隱式地轉(zhuǎn)換到期望類(lèi)型三、隱式地轉(zhuǎn)換接收端四、隱式類(lèi)五、含有隱式參數(shù)的主構(gòu)造方法六、上下文界定七、多個(gè)匹配的隱式定義2目

錄一、隱式定義的含義及規(guī)則

3一、隱式定義的含義及規(guī)則1.1隱式定義的含義程序員事先寫(xiě)好的定義,允許編譯器隱式地插入這些定義來(lái)解決類(lèi)型錯(cuò)誤。這部分定義通常對(duì)使用者不可見(jiàn),并且由編譯器自動(dòng)調(diào)用,故而得名“隱式定義”。隱式轉(zhuǎn)換屬于隱式定義的一種。4一、隱式定義的含義及規(guī)則標(biāo)記規(guī)則。只有用關(guān)鍵字“implicit”標(biāo)記的定義才能被編譯器隱式使用,任何函數(shù)、變量或單例對(duì)象都可以被標(biāo)記。作用域規(guī)則。Scala編譯器只會(huì)考慮在當(dāng)前作用域內(nèi)的隱式定義,否則,所有隱式定義都是全局可見(jiàn)的將會(huì)使得程序異常復(fù)雜甚至出錯(cuò)。

1.2隱式定義的規(guī)則5每次一個(gè)規(guī)則。編譯器只會(huì)插入一個(gè)隱式定義,不會(huì)出現(xiàn)“convert1(convert2(x))+y”這種嵌套的形式,但是可以讓隱式定義包含隱式參數(shù)來(lái)繞開(kāi)這個(gè)限制。顯式優(yōu)先原則。如果顯式定義能通過(guò)類(lèi)型檢查,就不必進(jìn)行隱式轉(zhuǎn)換。因此,總是可以把隱式定義變成顯式的,這樣代碼變長(zhǎng)但是歧義變少。用顯式還是隱式,需要取舍。

一、隱式定義的含義及規(guī)則1.2隱式定義的規(guī)則6二、隱式地轉(zhuǎn)換到期望類(lèi)型

7二、隱式地轉(zhuǎn)換到期望類(lèi)型把一個(gè)浮點(diǎn)數(shù)賦值給整數(shù)變量會(huì)報(bào)錯(cuò)。2.1不使用隱式轉(zhuǎn)換scala>vali:Int=1.5

<console>:11:error:typemismatch;

found:Double(1.5)

required:Int

vali:Int=1.5scala的編譯器對(duì)于類(lèi)型檢查比較嚴(yán)格。8二、隱式地轉(zhuǎn)換到期望類(lèi)型使用隱式轉(zhuǎn)換可以正確地將數(shù)據(jù)轉(zhuǎn)換到期望的類(lèi)型。2.2使用隱式轉(zhuǎn)換scala>importscala.language.implicitConversions

importscala.language.implicitConversions

scala>implicitdefdoubleToInt(x:Double)=x.toInt

doubleToInt:(x:Double)Int

scala>vali:Int=1.5

i:Int=1定義一個(gè)double轉(zhuǎn)Int的隱式轉(zhuǎn)換函數(shù)。9三、隱式地轉(zhuǎn)換接收端

10三、隱式地轉(zhuǎn)換接收端scala>classMyInt(vali:Int)

definedclassMyInt

scala>1.i

<console>:14:error:valueiisnotamemberofInt

1.i

^scala>implicitdefintToMy(x:Int)=newMyInt(x)

intToMy:(x:Int)MyInt

scala>1.i

res1:Int=1因?yàn)闃?biāo)準(zhǔn)值類(lèi)Int沒(méi)有叫“i”的字段而報(bào)錯(cuò)定義一個(gè)隱式轉(zhuǎn)換函數(shù),會(huì)將Int對(duì)象轉(zhuǎn)換成MyInt對(duì)象,使i的訪問(wèn)合法?!?.i”被編譯器隱式地展開(kāi)成了“intToMy(1).i”11四、隱式類(lèi)

12四、隱式類(lèi)4.1基本介紹使用關(guān)鍵字“implicit”聲明。編譯器會(huì)在隱式類(lèi)的相同層次下自動(dòng)生成一個(gè)與類(lèi)名相同的隱式轉(zhuǎn)換函數(shù),該轉(zhuǎn)換接收一個(gè)與隱式類(lèi)的主構(gòu)造方法相同的參數(shù),并用這個(gè)參數(shù)構(gòu)造一個(gè)隱式類(lèi)的實(shí)例對(duì)象來(lái)返回。4.2注意事項(xiàng)隱式類(lèi)不能是caseclass,并且主構(gòu)造方法有且僅有一個(gè)參數(shù)。隱式類(lèi)只能被定義在“類(lèi)”、“單例對(duì)象”或“特質(zhì)”里,不能單獨(dú)出現(xiàn)在頂層。13四、隱式類(lèi)4.3定義一個(gè)構(gòu)造長(zhǎng)方形的隱式類(lèi)自動(dòng)生成的caseclassRectangle(width:Int,height:Int)

objectRec{

implicitclassRectangleMaker(width:Int){

defx(height:Int)=Rectangle(width,height)

}

//implicitdefRectangleMaker(width:Int)=newRectangleMaker(width)

}14四、隱式類(lèi)4.4使用隱式類(lèi)scala>importRec.RectangleMaker

importRec.RectangleMaker

scala>1x10

res0:Rectangle=Rectangle(1,10)scala>1x10

<console>:12:error:valuexisnotamemberofInt

1x10

^Int類(lèi)并不存在方法“x”隱式轉(zhuǎn)換函數(shù)RectangleMaker可以把Int對(duì)象轉(zhuǎn)換成一個(gè)RectangleMaker類(lèi)的對(duì)象15五、隱式參數(shù)

16五、隱式參數(shù)在函數(shù)的最后一個(gè)參數(shù)列表中使用關(guān)鍵字“implicit”將該參數(shù)列表中的參數(shù)都聲明為隱式的,這樣整個(gè)參數(shù)列表的參數(shù)都是隱式參數(shù)。如:5.1聲明方式注意,即使括號(hào)里有多個(gè)參數(shù),也只需要開(kāi)頭寫(xiě)一個(gè)“implicit”。而且每個(gè)參數(shù)都是隱式的,不存在部分隱式部分顯式。defgreet(name:String)(implicitprompt:PreferredPrompt, drink:PreferredDrink)隱式參數(shù)包括隱式變量、隱式對(duì)象、隱式函數(shù)。最后一個(gè)參數(shù)列表17五、隱式參數(shù)5.2舉例classPreferredPrompt(valpreference:String)

classPreferredDrink(valpreference:String)

objectGreeter{

defgreet(name:String)(implicitprompt:PreferredPrompt,

drink:PreferredDrink)={

println("Welcome,"+name+".Thesystemisready.")

print("Butwhileyouwork,")

println("whynotenjoyacupof"+drink.preference+"?")

println(prompt.preference)

}

}

objectJoesPrefs{

implicitvalprompt=newPreferredPrompt("Yes,master>")

implicitvaldrink=newPreferredDrink("tea")

}隱式參數(shù)列表隱式對(duì)象18五、隱式參數(shù)缺省隱式參數(shù)列表,編譯器會(huì)嘗試自動(dòng)插入相應(yīng)的隱式定義。5.3使用方式一scala>importJoesPrefs._

importJoesPrefs._

scala>Greeter.greet("Joe")

Welcome,Joe.Thesystemisready.

Butwhile

youwork,whynotenjoyacupoftea?

Yes,master>scala>Greeter.greet("Joe")

<console>:12:error:couldnotfindimplicitvalueforparameterprompt:PreferredPrompt

Greeter.greet("Joe")

^缺省隱式參數(shù)列表19五、隱式參數(shù)也可以顯式給出參數(shù),但是要么全部缺省,要么全部顯式給出,不能只寫(xiě)一部分。5.4使用方式二scala>Greeter.greet("Joe")(prompt,drink)

Welcome,Joe.Thesystemisready.

Butwhile

youwork,whynotenjoyacupoftea?

Yes,master>

scala>Greeter.greet("Joe")(prompt)

<console>:15:error:notenoughargumentsformethodgreet:(implicitprompt:PreferredPrompt,implicitdrink:PreferredDrink)Unit.

Unspecifiedvalueparameterdrink.

Greeter.greet("Joe")(prompt)顯式提供參數(shù)部分缺省20六、含有隱式參數(shù)的主構(gòu)造方法

21六、含有隱式參數(shù)的主構(gòu)造方法6.1聲明方式classA(implicit

valx:Int)不僅是普通的函數(shù)可以有隱式參數(shù),類(lèi)的主構(gòu)造方法也可以包含隱式參數(shù)。輔助構(gòu)造方法是不允許出現(xiàn)隱式參數(shù)的。22六、含有隱式參數(shù)的主構(gòu)造方法如果類(lèi)A僅有一個(gè)參數(shù)列表,且是隱式的,那么A的實(shí)際定義形式是“A()(implicit參數(shù))”。若調(diào)用主構(gòu)造方法時(shí)顯式給出隱式參數(shù),就必須寫(xiě)出這個(gè)空括號(hào)。6.2使用細(xì)節(jié)一scala>classA(implicitvalx:Int)

definedclassA

scala>vala=newA(1)

<console>:12:error:noargumentsallowedfornullaryconstructorA:()(implicitx:Int)A

vala=newA(1)

^scala>vala=newA()(1)

a:A=A@7cf8f45a23六、含有隱式參數(shù)的主構(gòu)造方法若隱式參數(shù)由編譯器自動(dòng)插入,則空括號(hào)可有可無(wú)。6.3使用細(xì)節(jié)二scala>implicitvalORZ=233

ORZ:Int=233

scala>valb=newA

b:A=A@7d977a20

scala>b.x

res0:Int=233scala>valc=newA()

c:A=A@de0c402

scala>c.x

res1:Int=23324七、上下文界定

25七、上下文界定假設(shè)現(xiàn)在需要編寫(xiě)一個(gè)方法尋找“最大”的列表元素,并且具體行為會(huì)根據(jù)某個(gè)隱式Ordering[T]對(duì)象發(fā)生改變,那么可能定義如下:7.1maxList[T]函數(shù)的常規(guī)寫(xiě)法defmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T=

elementsmatch{

caseList()=>thrownewIllegalArgumentException("emptylist!")

caseList(x)=>x

casex::rest=>

valmaxRest=maxList(rest)(ordering)//參數(shù)ordering被顯式傳遞

if(ordering.gt(x,maxRest))x//參數(shù)ordering被顯式使用

elsemaxRest

}26七、上下文界定隱式導(dǎo)入的Predef對(duì)象里定義了下面這樣一個(gè)函數(shù):defimplicitly[T](implicitt:T)=t在缺省參數(shù)的情況下,編譯器會(huì)在當(dāng)前作用域下自動(dòng)尋找一個(gè)T類(lèi)型的隱式對(duì)象傳遞給參數(shù)t,然后把這個(gè)對(duì)象返回。例如,implicitly[ORZ]就會(huì)把當(dāng)前作用域下的隱式ORZ對(duì)象返回。7.2implicitly[T]函數(shù)27七、上下文界定7.3maxList[T]函數(shù)使用implicitly[T]的簡(jiǎn)潔寫(xiě)法defmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T=

elementsmatch{

caseList()=>thrownewIllegalArgumentException("emptylist!")

caseList(x)=>x

casex::rest=>

valmaxRest=maxList(rest)

if(implicitly[Ordering[T]].gt(x,maxRest))x

elsemaxRest

}28七、上下文界定[T:Ordering]7.4上下文界定語(yǔ)法7.5上下文界定的兩層含義defmaxList[T:Ordering](elements:List[T]):TdefmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T引入一個(gè)類(lèi)型參數(shù)T添加一個(gè)類(lèi)型為Ordering[T]的隱式參數(shù)29七、上下文界定7.6maxList[T]函數(shù)使用[T:Ordering]的簡(jiǎn)潔寫(xiě)法defmaxList[T:Ordering](elements:List[T]):T=

elementsmatch{

caseList()=>thrownewIllegalArgumentException("emptylist!")

caseList(x)=>x

casex::rest=>

valmaxRest=maxList(rest)

if(implicitly[Ordering[T]].gt(x,maxRest))x

elsemaxRest

}上下文界定30八、多個(gè)匹配的隱式定義

31八、多個(gè)匹配的隱式定義8.1模棱兩可的隱式定義scala>classA(implicitvalx:Int)

definedclassA

scala>implicitvalz=10

z:Int=10

scala>implicitvalzz=100

zz:Int=100

scala>vala=newA()

<console>:14:error:ambiguousimplicitvalues:

bothvaluezoftype=>Int

andvaluezzoftype=>Int

matchexpectedtypeInt

vala=newA()

^兩個(gè)隱式變量都符合作為類(lèi)A主構(gòu)造函數(shù)的參數(shù)的條件32八、多個(gè)匹配的隱式定義8.2更具體的定義---條件1該定義的類(lèi)型是更模糊的定義的子類(lèi)型。scala>classA(implicitvalx:Int)

definedclassA

scala>implicitvalz=10

z:Int=10

scala>implicitvalzz:Any=100

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論