日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

深入理解Scala的隐式转换系统

發(fā)布時間:2025/3/11 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解Scala的隐式转换系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文鏈接:http://www.cnblogs.com/MOBIN/p/5351900.html ---------------------------------------------- 摘要: 通過隱式轉換,程序員可以在編寫Scala程序時故意漏掉一些信息,讓編譯器去嘗試在編譯期間自動推導出這些信息來,這種特性可以極大的減少代碼量,忽略那些冗長,過于細節(jié)的代碼。 使用方式: 1.將方法或變量標記為implicit 2.將方法的參數(shù)列表標記為implicit 3.將類標記為implicit Scala支持兩種形式的隱式轉換: 隱式值:用于給方法提供參數(shù) 隱式視圖:用于類型間轉換或使針對某類型的方法能調用成功 隱式值: 例1:聲明person方法。其參數(shù)為name,類型String scala> def person(implicit name : String) = name //name為隱式參數(shù) person: (implicit name: String)String 直接調用person方法 scala> person <console>:9: error: could not find implicit value for parameter name: Stringperson^ 報錯!編譯器說無法為參數(shù)name找到一個隱式值 定義一個隱式值后再調用person方法 scala> implicit val p = "mobin" //p被稱為隱式值 p: String = mobin scala> person res1: String = mobin 因為將p變量標記為implicit,所以編譯器會在方法省略隱式參數(shù)的情況下去搜索作用域內的隱式值作為缺少參數(shù)。 但是如果此時你又在REPL中定義一個隱式變量,再次調用方法時就會報錯 scala> implicit val p1 = "mobin1" p1: String = mobin1 scala> person <console>:11: error: ambiguous implicit values:both value p of type => Stringand value p1 of type => Stringmatch expected type Stringperson^ 匹配失敗,所以隱式轉換必須滿足無歧義規(guī)則,在聲明隱式參數(shù)的類型是最好使用特別的或自定義的數(shù)據(jù)類型,不要使用Int,String這些常用類型,避免碰巧匹配 隱式視圖 隱式轉換為目標類型:把一種類型自動轉換到另一種類型 例2:將整數(shù)轉換成字符串類型: scala> def foo(msg : String) = println(msg) foo: (msg: String)Unitscala> foo(10) <console>:11: error: type mismatch; found : Int(10) required: String foo(10) ^ 顯然不能轉換成功,解決辦法就是定義一個轉換函數(shù)給編譯器將int自動轉換成String scala> implicit def intToString(x : Int) = x.toString intToString: (x: Int)Stringscala> foo(10) 10 隱式轉換調用類中本不存在的方法 例3:通過隱式轉換,使對象能調用類中本不存在的方法 class SwingType{def wantLearned(sw : String) = println("兔子已經(jīng)學會了"+sw) } object swimming{implicit def learningType(s : AminalType) = new SwingType } class AminalType object AminalType extends App{import com.mobin.scala.Scalaimplicit.swimming._val rabbit = new AminalTyperabbit.wantLearned("breaststroke") //蛙泳 } 編譯器在rabbit對象調用時發(fā)現(xiàn)對象上并沒有wantLearning方法,此時編譯器就會在作用域范圍內查找能使其編譯通過的隱式視圖,找到learningType方法后,編譯器通過隱式轉換將對象轉換成具有這個方法的對象,之后調用wantLearning方法 可以將隱式轉換函數(shù)定義在伴生對象中,在使用時導入隱式視圖到作用域中即可(如例4的learningType函數(shù)) 還可以將隱式轉換函數(shù)定義在兇對象中,同樣在使用時導入作用域即可,如例4 例4: class SwingType{def wantLearned(sw : String) = println("兔子已經(jīng)學會了"+sw) }package swimmingPage{ object swimming{implicit def learningType(s : AminalType) = new SwingType //將轉換函數(shù)定義在包中 } } class AminalType object AminalType extends App{import com.mobin.scala.Scalaimplicit.swimmingPage.swimming._ //使用時顯示的導入val rabbit = new AminalTyperabbit.wantLearned("breaststroke") //蛙泳 } 像intToString,learningType這類的方法就是隱式視圖,通常為Int => String的視圖,定義的格式如下: ? ? ?implicit def ?originalToTarget (<argument> : OriginalType) : TargetType 其通常用在于以兩種場合中: 1.如果表達式不符合編譯器要求的類型,編譯器就會在作用域范圍內查找能夠使之符合要求的隱式視圖。如例2,當要傳一個整數(shù)類型給要求是字符串類型參數(shù)的方法時,在作用域里就必須存在Int => String的隱式視圖 2.給定一個選擇e.t,如果e的類型里并沒有成員t,則編譯器會查找能應用到e類型并且返回類型包含成員t的隱式視圖。如例3 隱式類: 在scala2.10后提供了隱式類,可以使用implicit聲明類,但是需要注意以下幾點: 1.其所帶的構造參數(shù)有且只能有一個 2.隱式類必須被定義在類,伴生對象和包對象里 3.隱式類不能是case class(case class在定義會自動生成伴生對象與2矛盾 4.作用域內不能有與之相同名稱的標示符 例5: object Stringutils {implicit class StringImprovement(val s : String){ //隱式類def increment = s.map(x => (x +1).toChar)} } object Main extends App{import com.mobin.scala.implicitPackage.Stringutils._println("mobin".increment) } 編譯器在mobin對象調用increment時發(fā)現(xiàn)對象上并沒有increment方法,此時編譯器就會在作用域范圍內搜索隱式實體,發(fā)現(xiàn)有符合的隱式類可以用來轉換成帶有increment方法的StringImprovement類,最終調用increment方法。

隱式轉換的時機:

1.當方法中的參數(shù)的類型與目標類型不一致時

2.當對象調用類中不存在的方法或成員時,編譯器會自動將對象進行隱式轉換 隱式解析機制 即編譯器是如何查找到缺失信息的,解析具有以下兩種規(guī)則: 1.首先會在當前代碼作用域下查找隱式實體(隱式方法 ?隱式類 隱式對象) 2.如果第一條規(guī)則查找隱式實體失敗,會繼續(xù)在隱式參數(shù)的類型的作用域里查找 類型的作用域是指與該類型相關聯(lián)的全部伴生模塊,一個隱式實體的類型T它的查找范圍如下: (1)如果T被定義為T with A with B with C,那么A,B,C都是T的部分,在T的隱式解析過程中,它們的伴生對象都會被搜索 (2)如果T是參數(shù)化類型,那么類型參數(shù)和與類型參數(shù)相關聯(lián)的部分都算作T的部分,比如List[String]的隱式搜索會搜索List的 伴生對象和String的伴生對象 (3) 如果T是一個單例類型p.T,即T是屬于某個p對象內,那么這個p對象也會被搜索 (4) 如果T是個類型注入S#T,那么S和T都會被搜索 隱式轉換的前提: 1.不存在二義性(如例1) ? 2.隱式操作不能嵌套使用(如 convert1(covert2(x)))+y ? 3.代碼能夠在不使用隱式轉換的前提下能編譯通過,就不會進行隱式黑鐵

總結

以上是生活随笔為你收集整理的深入理解Scala的隐式转换系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产夜夜操 | 亚洲永久免费观看 | 永久av网站| av新天堂| 最新国产露脸在线观看 | 成人精品视频 | av一级大片 | 欧美一区二区在线观看 | 亚洲制服无码 | 性综艺节目av在线播放 | 天堂影视av | 国产精品久久久不卡 | 久久麻豆精品 | 少妇精品无码一区二区免费视频 | 日韩高清在线一区二区 | 一区二区三区四区免费观看 | 欧美一级淫片免费视频魅影视频 | 青在线视频 | 色爽av | 精品97人妻无码中文永久在线 | 成年人黄色网址 | 黄色国产视频网站 | 中国女人真人一级毛片 | 天堂网久久 | 少妇一级淫片免费放中国 | 中文字幕第页 | 亚洲精品aⅴ中文字幕乱码 国产精品调教视频 | 91视频看片 | 玉女心经 在线 | 少妇高潮毛片色欲ava片 | 亚洲精品视频在线观看免费视频 | 日韩淫 | 国产草草草| 男操女视频在线观看 | 亚洲人丰满奶水 | 成人私密视频 | 97精品人妻一区二区三区蜜桃 | 国产精品视频1区 | 久久免费视频99 | 在哪里可以看黄色片 | av香蕉 | 欧美成人午夜 | 免费看毛片的网站 | 国产最新视频 | 久久久黄色片 | 日韩一区二区三区视频 | 一区二区三区精品在线 | 国产精品日韩欧美大师 | 天天干天天舔 | 国产精品亲子伦对白 | 人与动物黄色片 | 人人综合| a级成人毛片 | 高清av一区二区三区 | 青青操久久 | 日韩一区欧美二区 | 羞羞网站在线观看 | 星空无限mv国产剧入选 | 国内自拍小视频 | 乱熟女高潮一区二区在线 | 久久艹影院 | 91精品国产一区二区三区蜜臀 | 不卡视频国产 | 美女主播福利视频 | 国产毛片一区二区三区va在线 | 国产一二精品 | 久精品在线 | 九九自拍偷拍 | 中文av一区二区 | 91在线网址 | 把高贵美妇调教成玩物 | 不卡在线一区 | 青草青在线 | 日日夜夜影院 | 欧美久久免费 | 黄色一级片免费播放 | 日本人毛片 | 桃花岛影院| 国产精品福利影院 | 国产中文久久 | 免费av免费观看 | 午夜性剧场 | 天天激情 | 91一区二区在线观看 | 伊人久久一区二区三区 | 中国美女洗澡免费看网站 | 黄色美女一级片 | 午夜激情久久 | 亚洲综合在线观看视频 | 97视频在线观看免费 | 污到下面流水的视频 | 91久久网| 成人瑟瑟| 九九涩 | 亚洲一区二区三区四区五区午夜 | 中国少妇色 | 视频丨9l丨白浆 | 五月丁香久久婷婷 | 亚洲阿v天堂 |