Ruby中的block代码块学习教程
1、什么是代码块 [1,2,3,4,5].each { |i| puts i } [1,5].each do |i| puts i end 块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。 竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样 2、掌握代码块的编写 array = [1,4] array.collect! do |n| n ** 2 end puts array.inspect # => [1,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,4] array.iterate! do |n| n ** 2 end puts array.inspect # => [1,16] 首先,我们打开Array,并添加进iterate!方法。方法名以!结尾表示危险方法,引起注意。现在我们就可能像使用collect!一样使用iterate! 与属性不同,在方法中不需要指定block的名字,而是使用yield来调用。yield会执行block中的代码。同时,注意我们是怎么把n(each_with_index当前处理的数字)传给yield的。传给yield的参数即对应了block中的参数(||中的部分)。现在n就能被block调用并在yield调用中返回n**2。 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方法的参数,所以编译不过,需加()。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |