第十一章 块(下)

(1)代码清单11.8

第十一章 块(下)_第1张图片

(2)根据上例进行的:控制块的执行

第十一章 块(下)_第2张图片

(3)Proc将块封装为对象

之前我们使用块,是定义方法然后根据这个方法名定义对应的块,这样方法名和块是唯一对应。

下面讲的是把块当作对象处理,需要用到Proc对象,那么使用Proc.new定义带块的方法,要调用块就去调用Proc对象的call方法。这样的块就不必和方法名唯一绑定。

第十一章 块(下)_第3张图片

(4)在方法定义时,如果末尾的参数使用"& 参数名"的形 式,Ruby 就会自动把调用方法时传进来的块封装为 Proc 对象。改写代码清单11.8为该形式:

第十一章 块(下)_第4张图片

我们在首行的方法定义中定义了 &block 参数。像这样,在变量名前添加 & 的参数被称为 Proc 参数。如果在调用方法时没有传递块,Proc 参数的值就为 nil,因此通过这个值就可以判断出是否有块被传入方法中。另外,执行块的语句不是 yield,而是 block.call(num),这一点与之前的例子也不一样。

在第 7 章中我们提到过方法可以有多个参数,而且定义参数的默认值等时都需要按照一定的顺序。而 Proc 参数则一定要在所有参数之后,也就是方法中最 后一个参数。

将块封装为 Proc 对象后,我们就可以根据需要随时调用块。甚至还可以将其赋值给实例变量,让别的实例方法去任意调用。

(5)

此外,我们也能将 Proc 对象作为块传给其他方法处理。例如,向call_each方法以外的其他方法----- Array#each 方法 传递Proc对象

第十一章 块(下)_第5张图片

这样一来,我们就可以非常方便地把调用 call_each 方法时接收到的块,原封不动地传给其他方法------ ary.each 方法

(6)局部变量与块变量

局部变量:如下在块外面定义的变量就是局部变量,x=1,y=1

块变量:块里面的变量,|x|

第十一章 块(下)_第6张图片

(7)

第十一章 块(下)_第7张图片

(8)

第十一章 块(下)_第8张图片

(9)

(1)块变量能更改块之外的局部变量

第十一章 块(下)_第9张图片

(2)

第十一章 块(下)_第10张图片

你可能感兴趣的:(第十一章 块(下))