码迷,mamicode.com
首页 > 其他好文 > 详细

第十一章 块(下)

时间:2016-02-11 15:44:51      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

(1)代码清单11.8

技术分享

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

技术分享

(3)Proc将块封装为对象

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

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

技术分享

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

技术分享

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

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

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

(5)

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

技术分享

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

(6)局部变量与块变量

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

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

技术分享

(7)

技术分享

(8)

技术分享

(9)

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

技术分享

(2)

技术分享

第十一章 块(下)

标签:

原文地址:http://www.cnblogs.com/blueColdFire/p/5186464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!