亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

非你所想Scala@我不是你想的那樣的匿名函數

2019-11-11 06:36:39
字體:
來源:轉載
供稿:網友

Scala 非常重視代碼的簡明扼要,形如arg => exPR的匿名函數, 可以很明顯的體現函數的結構體,也可以用在一些含有多條語句的復雜函數上。 對于自解釋參數名的函數,我們更優雅的選擇是使用占位符,以避免對參數進行聲明,例如

List(1, 2).map { i => i + 1 }

可以簡化成 :

List(1, 2).map { _ + 1 }

這兩個表達式是等價的,在REPL里執行的結果也一樣,如果我們加入一段debug語句,來看看表達式的運行過程將會如何呢? List(1, 2).map { i => println("hi"); i + 1 } List(1, 2).map { println("hi); _+ 1 } 讓我們來猜測一下,這兩段代碼運行的結果將會如何。。。

1. 第一種可能,程序將打?。? Hi List[Int] = List(2, 3) Hi List[Int] = List(2, 3)2. 第二種可能,程序將打?。? Hi Hi List[Int] = List(2, 3) Hi Hi List[Int] = List(2, 3)3. 第三種可能,程序將打?。? Hi List[Int] = List(2, 3) Hi Hi List[Int] = List(2, 3)4. 第四種可能: 第一段代碼打印 Hi Hi List[Int] = List(2, 3) 第二段程序將報編譯錯誤

你已經選好了答案, 現在我們把代碼輸入REPL,看看運行結果是不是和預想的一致, coding。。。 enter。。。 Author:mark

scala> List(1, 2).map { i => println("Hi"); i + 1 } Hi Hi res23: List[Int] = List(2, 3)scala> List(1, 2).map { println("Hi"); _ + 1 } Hi res25: List[Int] = List(2, 3)

此刻,我心中有一萬頭草泥馬在蹦騰, why, why,why ! 我們只是用占位符簡化了表達式的寫法,但是程序運行邏輯怎么就不一樣了呢? 因為匿名函數經常作為參數傳遞,通常情況下都是以{}包圍起來,順其自然,我們會認為在一對大括號內的代碼就是一整段函數體, 但實際上這個只是為了分隔代碼塊,一行或者多行語句,最終決定了這個代碼塊的結果。 這兩個代碼塊如何被解析將決定程序執行的行為,{ i => println(“Hi”); i + 1 } 遵守形式 arg => expr ,println(“Hi”); i + 1 屬于同一段代碼塊,所以println語句是方法體的一部分,方法每調用一次,println語句就將執行一次。

scala> val printAndAddOne =(i: Int) => { println("Hi"); i + 1 }printAndAddOne: Int => Int = <function1>scala> List(1, 2).map(printAndAddOne)HiHires29: List[Int] = List(2, 3)

但是第二段語句,代碼塊表示的兩個表達式:println(“Hi”)_+1,并且 _+1map()函數的輸出結果,println并不是函數體的一部分,只有在給map賦值時會執行。

scala> val printAndReturnAFunc ={ println("Hi"); ( _: Int ) + 1 }HiprintAndReturnAFunc: Int => Int = <function1>scala> List(1, 2).map(printAndReturnAFunc)res30: List[Int] = List(2, 3)

上面的說的一定滿足不了喜歡刨根問底的人,show me the turth,寫到這里,必須得拿出點兒證據。scala 代碼最終會編譯成class文件,用反編譯工具,我們可以看到編譯器理解的代碼。

public final void delayedEndpoint$anonymous$AnonymousFunction$1() { Predef..MODULE$.println("hi");List..MODULE$.apply(Predef..MODULE$.wrapIntArray(new int[] { 1, 2 })).map(new AbstractFunction1.mcII.sp() { public static final long serialVersionUID = 0L; public int apply$mcII$sp(int x$1) { return x$1 + 1; } public final int apply(int x$1) { return apply$mcII$sp(x$1); } }, List..MODULE$.canBuildFrom()); }

忽略掉其他無關信息,我們可以清楚的看到Predef..MODULE$.println(“hi”); 這段語句在方法執行體之外,這樣也就驗證了為什么只會打印一次。 scala鼓勵我們使用精簡的表達式,但是在使用占位符簡化表達式時,我們需要清楚我們在干什么,避免出現一些奇奇怪怪的bug。


上一篇:素數篩法

下一篇:CString類的完美總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国产美女视频| 欧美日韩国产二区| 91精品国产91久久| 亚洲free性xxxx护士hd| 亚洲欧美激情视频| 亚洲夜晚福利在线观看| 97久久精品人搡人人玩| 九色成人免费视频| 亚洲视频自拍偷拍| 国产欧美精品va在线观看| 日韩欧美亚洲国产一区| 国产精品久久久久aaaa九色| 久久香蕉精品香蕉| 色多多国产成人永久免费网站| 亚洲欧美日韩久久久久久| 亚洲第一精品自拍| 日韩av网站电影| 国产精品稀缺呦系列在线| 91麻豆国产语对白在线观看| 亚洲国产欧美一区二区丝袜黑人| 欧美日韩精品二区| 欧美午夜片欧美片在线观看| 日韩经典一区二区三区| 欧美日韩一二三四五区| 久久久久久网站| 国产在线98福利播放视频| 尤物yw午夜国产精品视频| 精品国产一区二区三区四区在线观看| 91久久在线播放| 懂色aⅴ精品一区二区三区蜜月| 亚洲经典中文字幕| 福利二区91精品bt7086| 91精品国产综合久久香蕉922| 日韩精品中文在线观看| 上原亚衣av一区二区三区| 欧美精品videos| 91av视频在线| 国产成人精品优优av| 69久久夜色精品国产69| 亚洲在线观看视频网站| 欧美一区二区视频97| 91av视频在线免费观看| 中文字幕亚洲自拍| 欧美激情按摩在线| 欧美激情精品久久久久久大尺度| 国产高清视频一区三区| 精品综合久久久久久97| 亚洲美女中文字幕| 亚洲国产精品电影在线观看| 欧美床上激情在线观看| 国产精品欧美在线| 九九热视频这里只有精品| 欧美激情精品久久久久久久变态| 最近中文字幕2019免费| 国产伦精品一区二区三区精品视频| 亚洲一区二区三区四区视频| 91爱视频在线| 国产不卡av在线| 91精品国产高清自在线| 亚洲成人久久久久| 欧美日本黄视频| 日韩av一区在线观看| 欧美成人中文字幕在线| 亚洲国内精品在线| 国产一区二区三区四区福利| 中文字幕av一区中文字幕天堂| 精品亚洲一区二区三区| 亚洲日韩中文字幕在线播放| 欧美日韩xxxxx| 亚洲一区二区中文| 色综合视频一区中文字幕| 国产视频精品一区二区三区| 91精品视频在线免费观看| 久久91亚洲人成电影网站| 国产成人精品国内自产拍免费看| 91成人免费观看网站| 欧美午夜激情在线| 日本道色综合久久影院| 欧美在线精品免播放器视频| 久久久久久久久久久久久久久久久久av| 日韩精品中文字| 亚洲国产成人精品一区二区| 亚洲自拍偷拍色图| 亚洲永久在线观看| 国产91色在线|| 欧美亚洲国产视频| 国产欧美一区二区三区在线看| 久久久久成人网| 国产在线观看精品一区二区三区| 7m第一福利500精品视频| 日韩在线观看免费全| 午夜精品久久久久久久男人的天堂| 亚洲欧洲免费视频| 久久久91精品国产| 亚洲最大的网站| 亚洲精品97久久| 国产精品香蕉国产| 久久精品国产清自在天天线| 亚洲电影免费观看高清完整版| 欧美激情视频给我| 色综合视频一区中文字幕| 亚州国产精品久久久| 亚洲高清一区二| 最近日韩中文字幕中文| 国产精自产拍久久久久久蜜| 欧美中文字幕在线观看| 91精品视频免费| 国产精品成av人在线视午夜片| 亚洲欧美中文在线视频| 欧美另类第一页| 亚洲一区二区久久久| 欧美日本亚洲视频| 狠狠躁夜夜躁久久躁别揉| 欧美巨猛xxxx猛交黑人97人| 亚洲美女av在线播放| 欧美极品第一页| 中文字幕亚洲情99在线| 日韩高清电影免费观看完整版| 日韩精品在线视频观看| 日韩欧美在线观看| 欧美日韩一区二区三区在线免费观看| 久久夜色精品亚洲噜噜国产mv| 日本高清不卡的在线| 欧美激情精品在线| 日韩在线免费视频观看| 欧美视频二区36p| 国产91av在线| 亚洲欧美一区二区三区情侣bbw| 国产成人午夜视频网址| 欧美日韩在线第一页| 亚洲欧美日韩国产中文专区| 国产人妖伪娘一区91| 国产精品专区一| 国产精品久久久久久久久久久不卡| 国产亚洲精品久久久| 久久国产精品久久久久| 日韩欧美亚洲一二三区| 国产日韩欧美在线| 欧美性xxxx极品hd欧美风情| 视频在线观看99| 久久久久日韩精品久久久男男| 亚洲欧洲av一区二区| 97在线看福利| 91精品国产综合久久香蕉922| 国产自摸综合网| 亚洲国产精品久久| 国产精品视频久| 日韩在线中文视频| 在线视频国产日韩| 国产午夜精品一区理论片飘花| 国产丝袜一区二区| 欧美激情亚洲视频| 欧美老少做受xxxx高潮| 九九热精品视频国产| 久久av红桃一区二区小说| 午夜精品视频在线| 久久精品一偷一偷国产| 中文字幕欧美日韩va免费视频| 亚洲高清久久久久久| 欧美日韩在线免费观看| 国产日韩欧美日韩| 亚洲毛片在线观看| 精品成人在线视频| 国产精品日韩专区|