2009年3月26日 星期四

Block, Proc, lambda, closure

Block,Proc,lambda的理解
Alex學Ruby[詳解 block和Proc對象]
Alex學Ruby[詳解 block和Proc對象 2]
block 就是匿名的一個程式區塊

Proc 也是匿名的程式區塊, 可是Proc 可以把這個block 存在某個變數裡, 真的當變數或參數用

lambda 也是用匿名函數的一種方法跟Proc很像, 只有一點點不同

lambda和Proc是一樣的,除了Proc的return會跳出調用的方法,lambda則不會,它只是返回自己。



Proc 跟 lambda 的其他差別

lambda生成的proc對象必須被call才可被調用。 而lambda方法會檢查傳入的參數個數,和參數類型。

Proc.new生成的對象不會去檢查參數個數, 只是多退少補(nil), 但是會檢查參數數據類型。


block 當參數傳時可以怎樣叫


lambda當變數傳
closure
closure引用的變量是call這個proc對象時產生的變量,在外部修改其值是沒用的




下面這個會用, 可是沒完全懂 XD


例子的map(&:upcase)相當於map{ |x| x.upcase }
這個是如何實現的? 其實Symbol類內部實現了一個to_proc方法:
map 方法只接受代碼塊,通過使用&可傳遞proc,來代替顯示的使用代碼塊。而這個時候&被應用於不是proc的對象,而傳進來的本身是個符號對象(:&upcase),所以解釋器自然而然的就會調用符號類的to_proc方法來得到一個proc。to_proc方法裡的self引用的是對其調用了to_proc的符號

1 則留言:

wonder 提到...

Lake 大大要不要開一堂課