Ruby中的block代码块学习教程实用指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Ruby中的block代码块学习教程”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
1、什么是代码块
理解这一步时,在Ruby里,{}或do...end之间的代码是一个代码块。代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用。比如:
[1,2,3,4,5].each { |i| puts i }
[1,2,3,4,5].each do |i|
puts i
end
块变量:以yield关键字调用block也能够传递参数,block中竖线(|)之间给出的参数名用来接收来自yield的参数。
理解这一步时,竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样
2、掌握代码块的编写
实际处理时,最常用、最轻松、最富争议、最有Ruby风格的方式是blocks。写法如下所示:
array = [1, 2, 3, 4]
array.collect! do |n|
n ** 2
end
puts 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
end
end
array = [1, 2, 3, 4]
array.iterate! do |n|
n ** 2
end
puts 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 x
end
实际处理时,是正确的,但是 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方法的参数,所以编译不过,需加()。
您可能感兴趣的文章:
- 深入理解Ruby中的代码块block特性
- 详解Ruby中的代码块对象Proc
- 详解Ruby中的代码块及其参数传递
-
09.03
Retro Geometric Cultural Poster
-
09.03
如何利用 Elastic 推理服务(EIS)及其扩展-步骤任务条
-
09.03
Ukiyo-e Hamster Summer Postcard
-
09.03
如何利用AI提升总经办工作计划的效率?一份详细的范文与提示词供你参考!
-
09.03
如何利用AI提升人事管理效率?一份详细的人事任务清单生成指南!
-
09.03
中芯国际赵海军:预计三季度出货量保持增长
-
-
-
- Ruby中的block代码块学习教程实用指南
- 09.03
-
- 谁还手动测量
- 09.03
-
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏