﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-accompy</title><link>http://www.blogjava.net/accompy/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 09:26:53 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 09:26:53 GMT</pubDate><ttl>60</ttl><item><title>在Ruby方法中使用yield调用块</title><link>http://www.blogjava.net/accompy/archive/2008/07/15/215026.html</link><dc:creator>accompy</dc:creator><author>accompy</author><pubDate>Tue, 15 Jul 2008 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/accompy/archive/2008/07/15/215026.html</guid><wfw:comment>http://www.blogjava.net/accompy/comments/215026.html</wfw:comment><comments>http://www.blogjava.net/accompy/archive/2008/07/15/215026.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/accompy/comments/commentRss/215026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/accompy/services/trackbacks/215026.html</trackback:ping><description><![CDATA[<p>最近在读李刚老师的书 Ruby on Rails敏捷开发最佳实践，相当实用的一本书，计划边学习边做笔记。下面我就和大家分享一下刚做的笔记（也可以说是总结）。&nbsp;</p>
<p align="center"><strong>在Ruby方法中使用yield调用块</strong></p>
<p><br />
Ruby方法可以接受代码块作为参数是一种非常灵活的用法，也是一种非常优秀的设计思路。假设有如下图1所示的3个方法：<br />
<img height="246" alt="" src="http://www.blogjava.net/images/blogjava_net/accompy/1.jpg" width="506" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图1<br />
<br />
从图1中可以看出，方法A、方法B和方法C大量的代码块都是完全相同的。那么是不是需要定义3个方法？是不是还有更好的做法？<br />
在软件开发领域，有一条重要的DRY规则：不要重复。在图1的3个方法中，可发现它们包含了大量的重复代码，为此，将上面3个方法合并成一个方法，而3个方法中特定的代码块则作为参数传入，这种做法如图2所示。<br />
<img height="287" alt="" src="http://www.blogjava.net/images/blogjava_net/accompy/2.jpg" width="499" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图2<br />
从图2中可以看出，通过使用代码块作为参数，可用一个方法来代替多个方法，从而提供更好的代码复用，保证软件具有更好的可维护性。<br />
看下面方法定义：<br />
# 定义一个方法<br />
def info(name)<br />
&nbsp;# 方法的固定代码部分1<br />
&nbsp;puts "info方法开始部分的固定输出：#{name}"<br />
&nbsp;# 调用代码块<br />
&nbsp;yield<br />
&nbsp;# 方法的固定代码部分2<br />
&nbsp;puts "info方法结束部分的固定输出：#{name}"<br />
end<br />
<br />
随着调用该方法时传入代码块的不同，上面的info方法的方法执行体也可以发生改变。看下面调用该方法的代码：<br />
# 使用代码块作为参数调用方法<br />
info("孙悟空")do <br />
&nbsp;puts "特定代码块A"<br />
end</p>
<p>运行上面的方法调用，看到如下运行结果：<br />
info方法开始部分的固定输出：孙悟空<br />
特定代码块A<br />
info方法结束部分的固定输出：孙悟空</p>
<p>如果改变调用上面方法的代码块，则可以改变上面info方法的执行体。看下面调用info方法的代码：<br />
# 使用代码块作为参数调用方法<br />
info("孙悟空")do <br />
&nbsp;puts "特定代码块B"<br />
end</p>
<p>运行上面的方法调用，看到如下输出结果：<br />
info方法开始部分的固定输出：孙悟空<br />
特定代码块B<br />
info方法结束部分的固定输出：孙悟空</p>
<p>对比两次输出，可发现同是调用info方法，但2个方法的执行体并不相同。通过传入代码作为方法参数，就可以实现更灵活的方法定义。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/accompy/aggbug/215026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/accompy/" target="_blank">accompy</a> 2008-07-15 17:31 <a href="http://www.blogjava.net/accompy/archive/2008/07/15/215026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>