国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

好處不止一點(diǎn)點(diǎn) 編程結(jié)構(gòu)--閉包

2019-11-18 15:32:57
字體:
供稿:網(wǎng)友
2007 年 1 月 22 日

閉包是可以用作函數(shù)參數(shù)和方法參數(shù)的代碼塊。一直以來,這種編程結(jié)構(gòu)都是一些語言(如 Lisp、Smalltalk 和 Haskell)的重要組成部分。盡管一些頗具競爭力的語言(如 C#)采納了閉包,但 java 社區(qū)至今仍抵制對它的使用。本文探討閉包在為編程語言帶來一點(diǎn)點(diǎn)便利的同時(shí)是否也帶來不必要的復(fù)雜性、閉包還有無更多的益處。

10 年前,我剛剛開始山地自行車運(yùn)動的時(shí)候,我更愿意選用零件盡可能少盡可能簡單的自行車。稍后,我意識到一些零件(如后減震器)可以保護(hù)我的背部和我自行車的框架在德克薩斯州高低起伏的山區(qū)中免受損害。我于是可以騎得更快,出問題的次數(shù)也漸少。雖然隨之帶來了操作上的復(fù)雜性和維護(hù)需求的增加,但對于我來說這點(diǎn)代價(jià)還是值得的。

好處不止一點(diǎn)點(diǎn) 編程結(jié)構(gòu)--閉包(圖一)關(guān)于本系列

在 跨越邊界系列 文章中,作者 BrUCe Tate 提出這樣一種觀點(diǎn),即當(dāng)今的 Java 程序員們通過學(xué)習(xí)其他方法和語言很好地武裝了自己。自從 Java 技術(shù)明顯成為所有開發(fā)項(xiàng)目的最佳選擇以來,編程前景得以改變。其他框架影響著 Java 框架的構(gòu)建方式,您從其他語言中學(xué)到的概念也可以影響 Java 編程。您編寫的 Python(或 Ruby、Smalltalk 等語言)代碼可以改變編寫 Java 代碼的方式。

本系列介紹與 Java 開發(fā)完全不同的編程概念和技術(shù),但是這些概念和技術(shù)也可以直接應(yīng)用于 Java 開發(fā)。在某些情況下,需要集成這些技術(shù)來利用它們。在其他情況下,可以直接應(yīng)用這些概念。具體的工具并不那么重要,重要的是其他語言和框架可以影響 Java 社區(qū)中的開發(fā)人員、框架,甚至是基本方式。

關(guān)于閉包這個(gè)問題,Java 愛好者們現(xiàn)在陷入了類似的爭論中。一些人認(rèn)為閉包帶給編程語言的額外復(fù)雜性并不劃算。他們的論點(diǎn)是:為了閉包帶來的一點(diǎn)點(diǎn)便利而打破原有語法糖的簡潔性非常不值得。其他一些人則認(rèn)為閉包將引發(fā)新一輪模式設(shè)計(jì)的潮流。要得到這個(gè)問題的最佳答案,您需要跨越邊界,去了解程序員在其他語言中是如何使用閉包的。

Ruby 中的閉包

閉包是具有閉合作用域 的匿名函數(shù)。下面我會具體解釋每個(gè)概念,但最好首先對這些概念進(jìn)行一些簡化。閉包可被視作一個(gè)遵循非凡作用域規(guī)則且可以用作參數(shù)的代碼塊。我將使用 Ruby 來展示閉包的運(yùn)行原理。用 irb 命令啟動解釋程序,然后用 load filename 命令加載每個(gè)樣例。清單 1 是一個(gè)最簡單的閉包:



清單 1. 最簡單的閉包
    3.times {puts "Inside the times method."}Results:Inside the times method.Inside the times method.Inside the times method.      

times 是作用在對象 3 上的一個(gè)方法。它執(zhí)行三次閉包中的代碼。{puts "Inside the times method."} 是閉包。它是一個(gè)匿名函數(shù),times 方法被傳遞到該函數(shù),函數(shù)的結(jié)果是打印出靜態(tài)語句。這段代碼比實(shí)現(xiàn)相同功能的 for 循環(huán)(如清單 2 所示)更加緊湊也更加簡單:



清單 2: 不含閉包的循環(huán)
    for i in 1..3   puts "Inside the times method."end      

Ruby 添加到這個(gè)簡單代碼塊的第一個(gè)擴(kuò)展是一個(gè)參數(shù)列表。方法或函數(shù)可通過傳入?yún)?shù)與閉包通信。在 Ruby 中,使用在 字符之間用逗號隔開的參數(shù)列表來表示參數(shù),例如 argument, list。用這種方法使用參數(shù),可以很輕易地在數(shù)據(jù)結(jié)構(gòu)(如數(shù)組)中構(gòu)建迭代。清單 3 顯示了在 Ruby 中對數(shù)組進(jìn)行迭代的一個(gè)例子:



清單 3. 使用了集合的閉包
    ['lions', 'tigers', 'bears'].each {item puts item}Results: lionstigersbears      

each 方法用來迭代。您通常想要用執(zhí)行結(jié)果生成一個(gè)新的集合。在 Ruby 中,這種方法被稱為 collect。您也許還想在數(shù)組的內(nèi)容里添加一些任意字符串。清單 4 顯示了這樣的一個(gè)例子。這些僅僅是眾多使用閉包進(jìn)行迭代的方法中的兩種。



清單 4. 將參數(shù)傳給閉包
    animals = ['lions', 'tigers', 'bears'].collect {item item.upcase}puts animals.join(" and ") + " oh, my."LIONS and TIGERS and BEARS oh, my.      



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 重庆市| 连城县| 阿拉善盟| 富蕴县| 遵义市| 韶关市| 游戏| 波密县| 双鸭山市| 泰宁县| 尼玛县| 新宾| 天长市| 招远市| 濮阳县| 电白县| 新津县| 揭东县| 新和县| 桂阳县| 枞阳县| 海晏县| 五指山市| 马公市| 社会| 宁陕县| 蓝田县| 肇州县| 丹棱县| 宜州市| 泗水县| 临漳县| 高清| 大埔区| 永福县| 千阳县| 禹州市| 巴中市| 永仁县| 嘉兴市| 泉州市|