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)用迭代器的方法返回。


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


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




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


lambda中調(diào)用break語(yǔ)句,只是從lambda自身返回。
下面例子這種情況下,break和return語(yǔ)句一樣。


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í)例:

lambda實(shí)例:
