- 論壇徽章:
- 0
|
ruby的block其實就是匿名函數(shù)(或C里的函數(shù)指針)。
在ruby里,方法大量使用block作為參數(shù),看起來很酷,寫起來也很高效。
例如,對這么一個數(shù)組:
x = [3,1,4,2,9,0]
想要找出所有小于3的成員,那么大家通常會想到數(shù)組的select方法:
z = x.select {|s| s <3}
select方法接受一個block為參數(shù)。
那么select具體是如何執(zhí)行這個block的呢?其實秘密就在于ruby的yield這個方法,它用來執(zhí)行block。
例如,咱們自己可以寫一個myfind方法來代替select:- class Array
- def myfind
- if block_given?
- z = []
- each {|s| z << s if yield s}
- z
- else
- raise "no block given"
- end
- end
- end
復制代碼 我們首先打開Array類(記住ruby的所有類都是開放的),然后定義myfind函數(shù)(def myfind)。
如果有block參數(shù)傳給myfind,那么執(zhí)行each {|s| z << s if yield s}這句,表示遍歷self數(shù)組,把每一個元素作為參數(shù)傳給yield。
然后yield就執(zhí)行用戶傳入的block,并判斷執(zhí)行結(jié)果。如果為真就把元素壓入z數(shù)組,最后返回z數(shù)組。
如果沒有block傳給myfind方法,會raise一個運行時錯誤,說明"no block given"。
OK 讓我們看完整腳本:- x = [3,1,4,2,9,0]
- class Array
- def myfind
- if block_given?
- z = []
- each {|s| z << s if yield s}
- z
- else
- raise "no block given"
- end
- end
- end
- z = x.myfind {|s| s < 3}
- p z
復制代碼 運行結(jié)果為:
$ ruby block.rb
[1, 2, 0] |
|