accompy

 

置顶随笔

[置顶]在Ruby方法中使用yield调用块

最近在读李刚老师的书 Ruby on Rails敏捷开发最佳实践,相当实用的一本书,计划边学习边做笔记。下面我就和大家分享一下刚做的笔记(也可以说是总结)。 

在Ruby方法中使用yield调用块


Ruby方法可以接受代码块作为参数是一种非常灵活的用法,也是一种非常优秀的设计思路。假设有如下图1所示的3个方法:

                                                           图1

从图1中可以看出,方法A、方法B和方法C大量的代码块都是完全相同的。那么是不是需要定义3个方法?是不是还有更好的做法?
在软件开发领域,有一条重要的DRY规则:不要重复。在图1的3个方法中,可发现它们包含了大量的重复代码,为此,将上面3个方法合并成一个方法,而3个方法中特定的代码块则作为参数传入,这种做法如图2所示。

                                                                       图2
从图2中可以看出,通过使用代码块作为参数,可用一个方法来代替多个方法,从而提供更好的代码复用,保证软件具有更好的可维护性。
看下面方法定义:
# 定义一个方法
def info(name)
 # 方法的固定代码部分1
 puts "info方法开始部分的固定输出:#{name}"
 # 调用代码块
 yield
 # 方法的固定代码部分2
 puts "info方法结束部分的固定输出:#{name}"
end

随着调用该方法时传入代码块的不同,上面的info方法的方法执行体也可以发生改变。看下面调用该方法的代码:
# 使用代码块作为参数调用方法
info("孙悟空")do
 puts "特定代码块A"
end

运行上面的方法调用,看到如下运行结果:
info方法开始部分的固定输出:孙悟空
特定代码块A
info方法结束部分的固定输出:孙悟空

如果改变调用上面方法的代码块,则可以改变上面info方法的执行体。看下面调用info方法的代码:
# 使用代码块作为参数调用方法
info("孙悟空")do
 puts "特定代码块B"
end

运行上面的方法调用,看到如下输出结果:
info方法开始部分的固定输出:孙悟空
特定代码块B
info方法结束部分的固定输出:孙悟空

对比两次输出,可发现同是调用info方法,但2个方法的执行体并不相同。通过传入代码作为方法参数,就可以实现更灵活的方法定义。

 

posted @ 2008-07-15 17:31 accompy 阅读(715) | 评论 (2)编辑 收藏

仅列出标题  

导航

统计

常用链接

留言簿(1)

随笔档案

文章档案

搜索

最新评论