Block、Proc 與 Lambda的區(qū)別

Ruby的Block塊是它的關(guān)鍵特色之一,用塊能夠?qū)懗龊?jiǎn)明且高度可重用的算法。我們也會(huì)經(jīng)常用到,例如:products.map(&:product_name) 這兒我們就傳遞了一個(gè)proc

Block 與Proc的區(qū)別:

Block是代碼塊,Proc是對(duì)象;

參數(shù)列表中最多只能有一個(gè)Block, 但是可以有多個(gè)Proc或Lambda;

Block可以看成是Proc的一個(gè)類(lèi)實(shí)例.

Proc 與Lambda 區(qū)別:

Proc和Lambda都是Proc對(duì)象;

Lambda檢查參數(shù)個(gè)數(shù),當(dāng)傳遞的參數(shù)超過(guò)一個(gè)時(shí),會(huì)報(bào)錯(cuò),而Proc不檢查,當(dāng)傳遞參數(shù)多于一個(gè)時(shí),只傳遞第一個(gè)參數(shù),忽略掉其他參數(shù);

1、代碼塊、procs和lambda中的return語(yǔ)句

在一個(gè)代碼塊中的return語(yǔ)句不僅僅會(huì)從你該代碼塊的迭代器返回,它還會(huì)從調(diào)用迭代器的方法返回。

?下面的exiting method將不會(huì)被執(zhí)行

proc與代碼塊類(lèi)似,如果調(diào)用的proc執(zhí)行一個(gè)return語(yǔ)句,它會(huì)試圖從代碼塊所在的方法返回。

proc下面的exiting method將不會(huì)被執(zhí)行

但是,lambda中的語(yǔ)句僅僅從lambda自身返回。lamdba后面的語(yǔ)句也會(huì)繼續(xù)執(zhí)行。

lamdba下面的exiting method執(zhí)行
lamdba下面的exiting code執(zhí)行

2、break語(yǔ)句

proc中調(diào)用break語(yǔ)句,會(huì)是該代碼塊返回到它的迭代器,然后該迭代器再返回到它的調(diào)用方法。


proc下面的exiting iterator不會(huì)執(zhí)行

lambda中調(diào)用break語(yǔ)句,只是從lambda自身返回。

下面例子這種情況下,break和return語(yǔ)句一樣。

lamdba下面的exiting test method執(zhí)行

3、頂級(jí)的next語(yǔ)句在代碼塊、proc和lambda中有相同的行為:它使調(diào)用代碼塊、proc和lambda的yield語(yǔ)句或call返回。

redo在proc和lambda中也有相同的行為,它讓控制流轉(zhuǎn)向proc和lambda的開(kāi)始處。

4、傳給proc和lambda的參數(shù)

調(diào)用proc使用的是yield語(yǔ)義,而調(diào)用lambda使用的是invocation語(yǔ)義。

proc實(shí)例:

多余的參數(shù)被忽略,array automatically unpacked

lambda實(shí)例:


?可以看到參數(shù)個(gè)數(shù)必須嚴(yán)格按照l(shuí)amdba的定義,否則報(bào)錯(cuò)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容