1. 程式人生 > >Ruby中的閉包:Block,Proc,lambda的聯絡與區別

Ruby中的閉包:Block,Proc,lambda的聯絡與區別

閉包(Closure),是指未繫結到任何物件的自由程式碼,閉包中的程式碼與任何物件和全域性變數無關,只與執行此段程式碼的上下文相關。

今天我們簡要的看一下ruby中的閉包實現。

Ruby中的閉包實現有:Block,Proc,Lambada。

首先,我們來看Block。

ary = [1,2,3,4]

ary.collect! do |a|

        a*a

end

ary.each do |a|

        puts a

end

這段程式碼,我們使用了Array物件的block方法,將ary中的每個元素平方一把。從例子中我們可以看到block使用起來很方便,想必傳統的Java以及C編碼,省略掉了冗餘的迴圈,讓你更加專注業務程式碼,這也是ruby的好處之一。

使用block的最大好處就是可以省略重複的冗餘的無用的程式碼,我們再來看一個讀檔案的例子:

#file block

File.open(__FILE__) do |f|

puts f.readlines

end

對比我們用Java程式碼來讀檔案,每次都很反感那個冗長的try-catch-finally。從上面的ruby程式碼中我麼可以看到,ruby語言給你做了處理,通過block你可以不用寫無用的系統程式碼了。

從上面的例子我們可以看到,Ruby中的Block對開發者來說,不用再寫那些冗餘無用的系統程式碼,而是更加專注業務程式碼,提升開發效率。

其次,我們再看Proc。

如果你經常使用Block,你會發現一個問題:程式碼中會有很多重複的Block,比如好多地方需要列印檔案內容。怎麼解決呢?你第一個想到的是寫一個公共函式,不錯,可以解決。但是記住你使用的是ruby語言,不要重新造輪子。Ruby提供了函式化的Block:Proc。

我們看一個簡單的Proc例子:

#file block with Proc

p = Proc.new{|f| puts f.readlines}

File.open(__FILE__, &p)

上面例子可以看到,將Block程式碼定義為一個Proc物件,然後在使用Block的地方用Proc替換,這樣就做到了完美的程式碼複用。

最後我們看看lambda。

Lambda是一種表示式的名稱,ruby中可以通過lambda表示式建立Proc物件。我們先看例子:

#file block with Proc created with lambda

new_p = lambda{|f| puts f.readlines}

File.open(__FILE__, &new_p)

上面例子中,我們使用系統的lambda方法建立了一個Proc物件,其效果與Proc.new創建出來的是一樣的。其實使用lambda與使用Proc.new效果是一樣的,只不過lambda是一種標準的方法,其他語言如Python也支援,因此ruby中也支援了。