Ruby中的block代码块学习教程(ruby code editor)学到了吗

随心笔谈2年前发布 admin
200 0 0

文章摘要

Ruby中的代码块是指{}或do...end之间的代码,只能出现在方法的后边,紧接在方法最后一个参数的同一行上,通过yield关键字调用。块变量用于接收yield传入的参数,具有与正常方法参数相同的作用。代码块的编写方式主要有两种:使用{}或do...end结构,以及通过yield调用块。 文章还介绍了如何通过自定义方法(如iterate!)使用代码块对数组进行迭代操作。例如,定义Array类中的iterate!方法,使用block对数组元素进行平方处理。此外,文章还讨论了代码块的优先级问题,指出{}优先级高于do...end,并建议使用括号避免歧义。 总结:文章详细解释了Ruby代码块的基本概念、编写方式及其注意事项,强调了代码块在处理迭代操作中的应用。



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中的代码块及其参数传递

© 版权声明

相关文章