Ruby中的block代码块学习教程
技术  /  管理员 发布于 5年前   599
1、什么是代码块
在Ruby中,{}或do...end之间的代码是一个代码块。代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用。例如:
[1,2,3,4,5].each { |i| puts i }[1,2,3,4,5].each do |i| puts iend
块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。
竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样
2、掌握代码块的编写
最常见、最简单、最富争议、最有Ruby风格的方式是blocks。写法如下:
array = [1, 2, 3, 4]array.collect! do |n| n ** 2endputs array.inspect# => [1, 4, 9, 16]
do…end构成一个block。然后把这个block通过collect!传给一个数组。就可以使用block中的n来迭代数组中每个元素。
collect!是Ruby库里的方法,下面我们来写一个自己的类似方法iterate!
class Array def iterate! self.each_with_index do |n, i| self[i] = yield(n) end endendarray = [1, 2, 3, 4]array.iterate! do |n| n ** 2endputs array.inspect# => [1, 4, 9, 16]
首先,我们打开Array,并添加进iterate!方法。方法名以!结尾表示危险方法,引起注意。现在我们就可能像使用collect!一样使用iterate!
与属性不同,在方法中不需要指定block的名字,而是使用yield来调用。yield会执行block中的代码。同时,注意我们是怎么把n(each_with_index当前处理的数字)传给yield的。传给yield的参数即对应了block中的参数(||中的部分)。现在n就能被block调用并在yield调用中返回n**2。
整个调用如下:
1、一个整数组成的数组调用iterate!
2、当yield被调用时,把n(第一次为1,第二次为2,…)传给block
3、block对n进行n**2。因为是最后一行,自动作为结果返回。
4、yield得到block的结果,并把值重写到array里。
5、数据中每个对象执行相同操作。
3、{}和do...end优先级不同
在传递一个block时,使用{}传递的block比使用do…end的优先级要高;
为了避免引起歧义,最好使用()将参数括起来。例如:
1.upto 3 do |x|puts xend
是正确的,但是 1.upto 3 {|x| puts x} 编译不通过,应该写成 1.upto(3) {|x| puts x}
原因:
1.upto 3 do…end 中block会传递到upto方法里面,3会作为一个参数传递给upto
1.upto 3 {|x| puts x} 一句会把3当做函数名,将block传递到这个函数,其返回值作为upto方法的参数,所以编译不过,需加()。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号