- 论坛徽章:
- 0
|
ruby的block其实就是匿名函数(或C里的函数指针)。
在ruby里,方法大量使用block作为参数,看起来很酷,写起来也很高效。
例如,对这么一个数组:
x = [3,1,4,2,9,0]
想要找出所有小于3的成员,那么大家通常会想到数组的select方法:
z = x.select {|s| s <3}
select方法接受一个block为参数。
那么select具体是如何执行这个block的呢?其实秘密就在于ruby的yield这个方法,它用来执行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函数(def myfind)。
如果有block参数传给myfind,那么执行each {|s| z << s if yield s}这句,表示遍历self数组,把每一个元素作为参数传给yield。
然后yield就执行用户传入的block,并判断执行结果。如果为真就把元素压入z数组,最后返回z数组。
如果没有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
复制代码 运行结果为:
$ ruby block.rb
[1, 2, 0] |
|