﻿<?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-ivaneeo's blog-随笔分类-ruby－宝石也锋芒</title><link>http://www.blogjava.net/ivanwan/category/2973.html</link><description>自由的力量，自由的生活。</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2014 08:03:11 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2014 08:03:11 GMT</pubDate><ttl>60</ttl><item><title>redmine敏捷开发插件</title><link>http://www.blogjava.net/ivanwan/archive/2014/11/18/420257.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 18 Nov 2014 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2014/11/18/420257.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/420257.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2014/11/18/420257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/420257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/420257.html</trackback:ping><description><![CDATA[<div>http://redminecrm.com/pages/vmware_image</div><img src ="http://www.blogjava.net/ivanwan/aggbug/420257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2014-11-18 18:23 <a href="http://www.blogjava.net/ivanwan/archive/2014/11/18/420257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jruby jdbc连接oracle</title><link>http://www.blogjava.net/ivanwan/archive/2009/04/22/266989.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Wed, 22 Apr 2009 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2009/04/22/266989.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/266989.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2009/04/22/266989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/266989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/266989.html</trackback:ping><description><![CDATA[<div>require 'java'</div>
<div>import 'oracle.jdbc.driver.OracleDriver'</div>
<div><br />
</div>
<div>module JavaLang</div>
<div>&nbsp;&nbsp;include_package "java.lang"</div>
<div>end</div>
<div><br />
</div>
<div>module JavaSql</div>
<div>&nbsp;&nbsp;include_package "java.sql"</div>
<div>end</div>
<div><br />
</div>
<div>#JavaLang::Class.forName("oracle.jdbc.driver.OracleDriver").newInstance</div>
<div>##发现如果直接用Class.forName话根本找不到类。看来jruby是预先导入的直接用import CLASS即可</div>
<div>con =</div>
<div>&nbsp;&nbsp;JavaSql::DriverManager.getConnection( \</div>
<div>&nbsp;&nbsp; &nbsp;"jdbc:oracle:thin:@132.228.129.104:1521:ods","ods","ods")</div>
<div>&nbsp;&nbsp;sql = con.createStatement()</div>
<div><br />
</div>
<div>&nbsp;&nbsp;result = sql.executeQuery("select * from dual")</div>
<div><br />
</div>
<div>&nbsp;&nbsp;while result.next</div>
<div>&nbsp;&nbsp; &nbsp;puts result.getString(1)</div>
<div>&nbsp;&nbsp;end</div>
<div><br />
</div>
<img src ="http://www.blogjava.net/ivanwan/aggbug/266989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2009-04-22 14:50 <a href="http://www.blogjava.net/ivanwan/archive/2009/04/22/266989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rdoc地址集合</title><link>http://www.blogjava.net/ivanwan/archive/2006/11/20/82341.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Mon, 20 Nov 2006 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/11/20/82341.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/82341.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/11/20/82341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/82341.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/82341.html</trackback:ping><description><![CDATA[1.ruby<br />    http://www.ruby-doc.org/core/<br />    代理访问:http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.ruby-doc.org/core/<br /><br />    http://www.ruby-doc.org/stdlib/<br />2.rmagick<br />    http://studio.imagemagick.org/RMagick/doc/index.html<br /><br />3.gemjack.com集合的大多数rdoc(推荐!)<br />    http://gemjack.com/<br /><img src ="http://www.blogjava.net/ivanwan/aggbug/82341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-11-20 17:44 <a href="http://www.blogjava.net/ivanwan/archive/2006/11/20/82341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dbi如何操作blob</title><link>http://www.blogjava.net/ivanwan/archive/2006/11/20/82339.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Mon, 20 Nov 2006 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/11/20/82339.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/82339.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/11/20/82339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/82339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/82339.html</trackback:ping><description><![CDATA[mysql和oracle存储图片文件都是用blob类型,但是ruby怎么处理的呢?<br />ruby还是把它当作字符串,但是要经过加工.<br /><br />我们完全可以使用rmagick这个图形库来进行.<br /><br /><br />代码:<br />    require 'rubygems'<br />    require_gem 'rmagick'<br />    include Magick<br /><br />    DBI.connect('DBI:Mysql:test_dbo:192.168.0.164', 'mysql', '') { |dbh|<br />     dbh.execute 'SET NAMES utf8'<br />       1.upto(13) { |i|<br />      str = "insert into users(name, pwd, img) values(?,?,?)"<br />     dbh.prepare(str) { |st|<br /> jpg = Image.read('1.jpg').first<br />  st.execute('a', 'b', jpg.to_blob)<br />  }<br /> }<br /> }<br /><br />如果从数据库反响出来,也类似(from_blob方法)<br /><br /><img src ="http://www.blogjava.net/ivanwan/aggbug/82339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-11-20 17:38 <a href="http://www.blogjava.net/ivanwan/archive/2006/11/20/82339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dbi或activerecord操作mysql的中文问题</title><link>http://www.blogjava.net/ivanwan/archive/2006/11/20/82256.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Mon, 20 Nov 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/11/20/82256.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/82256.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/11/20/82256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/82256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/82256.html</trackback:ping><description><![CDATA[
		<span style="font-family: monospace;">首先创建表,我们这里默认编码utf8:<br /><br /></span>create table samples (<br /><pre>    id int not null auto_increment,<br />    foo varchar(100) not null,<br />    bar text not null,<br />    primary key (id)<br />) Type=MyISAM CHARACTER SET utf8;<br /><br /><br />这里创建表类型时要使用MyISAM类型,因为只有MyISAM类型才支持完整的utf8.最后设置编码utf8.<br /><br />1.dbi操作数据库<br />	如果你本地编码时gbk的话,首先要默认类Iconv进行转换.<br />		require 'iconv'<br />		def gb2u str<br />			conv = Iconv.new("UTF-8", "GBK")<br />			str = conv.iconv(str)<br />			str &lt;&lt; conv.iconv(nil)<br />			conv.close<br /><br />			str<br />		end<br /><br />	插入代码:<br />		DBI.connect('DBI:Mysql:test:localhost', 'mysql', '') { |dbh|<br />	 		dbh.execute 'SET NAMES utf8'  #这里要指明代码<br />     			1.upto(13) { |i|<br />	  			st.execute("insert into samples(foo, bar) values('#{gb2u('一')}#{i}', '#{gb2u('二')}')")<br />	  		}<br />     		}<br /><br /><br /><br />2.activerecord<br />	activerecord是对dbi的包装.(也更神,呵呵!)<br />	代码:<br />		require     'rubygems'<br />		require_gem 'activerecord' #因为我是gem的安装<br /><br />		ActiveRecord::Base.establish_connection(<br />			:adapter =&gt;  "mysql",<br />			:host     =&gt; "localhost",<br />			:database =&gt; "test",<br />			:username =&gt; "mysql",<br />			:password =&gt; "",<br />			:encoding =&gt; "utf8") #编码只需这里指明<br /><br />		#指明表<br />		class Mytab &lt; ActiveRecord::Base<br />			set_table_name 'samples'<br />		end<br /><br />		#插入数据<br />		tab = Mytab.new<br />		tab.foo= gb2u('一')<br />		tab.bar = gb2u('二')<br />		tab.save<br /><br />		#查询数据<br />		data = Mytab.find(:all)<br />		data.each { |line| <br />			puts "['#{line[:id]}', '#{line[:foo]}, '#{line[:bar]}]" <br />		}<br /><br /><br /><br /><br /></pre><img src ="http://www.blogjava.net/ivanwan/aggbug/82256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-11-20 14:28 <a href="http://www.blogjava.net/ivanwan/archive/2006/11/20/82256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rrobots简单例子</title><link>http://www.blogjava.net/ivanwan/archive/2006/11/18/81878.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Fri, 17 Nov 2006 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/11/18/81878.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/81878.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/11/18/81878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/81878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/81878.html</trackback:ping><description><![CDATA[看rrobots的一个简单的例子:<br /><br />----------------------- code -----------------------<br />require 'robot'<br /><br />class NervousDuck<br />   include Robot<br /><br />  def tick events<br />    turn_radar 1 if time == 0<br />    turn_gun 30 if time &lt; 3<br />    accelerate 1<br />    turn 2<br />    fire 3 unless events['robot_scanned'].empty? <br />  end<br />end<br /><br />----------------------- code -----------------------<br /><br />这里至少要实现tick方法.<br /><br />下面是控制robot的一些方法和属性:<br /><br />  battlefield_height  #the height of the battlefield<br />  battlefield_width   #the width of the battlefield<br />  energy              #your remaining energy (if this drops below 0 you are dead)<br />  gun_heading         #the heading of your gun, 0 pointing east, 90 pointing <br />                      #north, 180 pointing west, 270 pointing south<br />  gun_heat            #your gun heat, if this is above 0 you can't shoot<br />  heading             #your robots heading, 0 pointing east, 90 pointing north,<br />                      #180 pointing west, 270 pointing south<br />  size                #your robots radius, if x &lt;= size you hit the left wall<br />  radar_heading       #the heading of your radar, 0 pointing east, <br />                      #90 pointing north, 180 pointing west, 270 pointing south<br />  time                #ticks since match start<br />  speed               #your speed (-8/8)<br />  x                   #your x coordinate, 0...battlefield_width<br />  y                   #your y coordinate, 0...battlefield_height<br />  accelerate(param)   #accelerate (max speed is 8, max accelerate is 1/-1, <br />                      #negativ speed means moving backwards)<br />  stop                #accelerates negativ if moving forward (and vice versa), <br />                      #may take 8 ticks to stop (and you have to call it every tick)<br />  fire(power)         #fires a bullet in the direction of your gun, <br />                      #power is 0.1 - 3, this power will heat your gun<br />  turn(degrees)       #turns the robot (and the gun and the radar), <br />                      #max 10 degrees per tick<br />  turn_gun(degrees)   #turns the gun (and the radar), max 30 degrees per tick<br />  turn_radar(degrees) #turns the radar, max 60 degrees per tick<br />  dead                #true if you are dead<br />  say(msg)            #shows msg above the robot on screen<br />  broadcast(msg)      #broadcasts msg to all bots (they recieve 'broadcasts'<br />                      #events with the msg and rough direction)<br /><br /><img src ="http://www.blogjava.net/ivanwan/aggbug/81878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-11-18 00:33 <a href="http://www.blogjava.net/ivanwan/archive/2006/11/18/81878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rubygems几个简单使用方法</title><link>http://www.blogjava.net/ivanwan/archive/2006/11/07/79699.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 07 Nov 2006 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/11/07/79699.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/79699.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/11/07/79699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/79699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/79699.html</trackback:ping><description><![CDATA[
		<pre>
				<code>1。gem query --remote        # shortcut: gem q -R<br />#列出所有包<br />2。gem query --remote --name-matches doom
  # shortcut: gem q -R -n doom<br />#列出所有名字匹配的包<br />3。gem install --remote progressbar
# shortcut: gem i -r progressbar<br />#安装指定名字的包。<br />gem ins -r progressbar --version '&gt; 0.0.1' #这里可以匹配版本<br />4。gem specification  progressbar
# shortcut: gem spec progressbar<br />#查看安装过的指定包详细信息<br />5。<code>gem uninstall progressbar<br />#卸载包<br />6。gem query --local
# shortcut: 'gem q -L'<br />#列出所有本地安装过的包<br />7。<code>gem ins rake<br />#在本地安装，如果没有远程安装<br />8。<code>gem list -b ^C<br />#列出所有以C开头的包<br />9。<code>gem_server<br />开启rdoc服务。可以查看安装包的rdoc</code></code></code></code></code>
		</pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/79699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-11-07 21:12 <a href="http://www.blogjava.net/ivanwan/archive/2006/11/07/79699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(14)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69187.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69187.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69187.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69187.html</trackback:ping><description><![CDATA[class Song<br />    include Comparable    ##<a id="a6.2e12.20include.a4.c8extend.a4.cf.a4.c9.a4.a6.b0.e3.a4.a4.a4.de.a4.b9.a4.ab" name="a6.2e12.20include.a4.c8extend.a4.cf.a4.c9.a4.a6.b0.e3.a4.a4.a4.de.a4.b9.a4.ab"><code>include</code>和<code>extend</code>有什么不同？</a><h2><!-- RDLabel: "6.12 include和extend有什么不同？" --></h2><code>                                     ##include</code>负责将<code>module</code>插入到类(模块)中，这样就能以函数的形式来调用方法；而<code>extend</code>负责将<code>module</code>插入到对象(实例)中，这样就添加了特殊方法。<br /><br />    @@plays = 0                ##类变量，必须初始化<br />    attr_reader :name, :artist, :duration    ##分别为@name,@artist,@duration设置可读的属性<br />    attr_writer :duration                                   ##对@duration设置可写的属性<br /><br />    <br /><pre>    def initialize(name, artist, duration)<br />    	@name     = name<br />   	@artist   = artist<br />    	@duration = duration<br /><br />	@plays    = 0		##对象变量<br />    end<br /><br />    def to_s<br />    	"Song: #@name--#@artist (#@duration)"<br />    end<br /><br />  def name	##函数式的公开所有变量<br />    @name<br />  end<br />  def artist<br />    @artist<br />  end<br />  def duration<br />    @duration<br />  end<br /><br /><br /></pre><img src ="http://www.blogjava.net/ivanwan/aggbug/69187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 16:33 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(13)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69180.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69180.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69180.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69180.html</trackback:ping><description><![CDATA[
		<pre>while gets<br />  if /Ruby/<br />    print<br />  end<br />end<br /><br />##等同代码<br /><br /> ARGF.each {|line|  print line  if line =~ /Ruby/ }<br />##ARGF<br />##An object providing access to virtual concatenation of files passed as command-line<br />##arguments or standard input if there are no command-line arguments. A synonym for<br />##$&lt;.<br /><br />##等同代码<br />print ARGF.grep(/Ruby/)<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 16:07 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(12)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69178.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69178.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69178.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69178.html</trackback:ping><description><![CDATA[
		<pre>##闭包的常见用法  <br />[ 'cat', 'dog', 'horse' ].each {|name| print name, " " }<br />  5.times {  print "*" }<br />  3.upto(6) {|i|  print i }	##3..6又一写法<br />  ('a'..'e').each {|char| print char }<br /><br />##输出函数的格式字符串<br />printf("Number: %5.2f,\nString: %s\n", 1.23, "hello")<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:59 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(11)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69175.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69175.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69175.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69175.html</trackback:ping><description><![CDATA[
		<pre>#############################################<br />##闭包的一个用法<br />  animals = %w( ant bee cat dog elk )    # create an array<br />  animals.each {|animal| puts animal }   # iterate over the contents<br /><br /><br />#############################################</pre>
		<pre>  def call_block<br />    puts "Start of method"<br />    yield					##执行传入的参数.这里为"In the block"<br />    yield<br />    puts "End of method"<br />  end<br /><br />  call_block { puts "In the block" }<br /><br />##############################################<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:52 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(10)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69173.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69173.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69173.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69173.html</trackback:ping><description><![CDATA[
		<pre>##块的用法<br /> { puts "Hello" }       # this is a block<br /><br />  do                     ###<br />    club.enroll(person)    # and so is this<br />    person.socialize       #<br />  end                    ###<br /><br /><br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:49 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(9)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69168.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69168.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69168.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69168.html</trackback:ping><description><![CDATA[
		<pre>line = "abc"<br />if line =~ /Perl|Python/	##匹配正则表达式<br />    puts "Scripting language mentioned: #{line}" <br />end<br /><br /><br />  line.sub(/Perl/, 'Ruby')    # replace first 'Perl' with 'Ruby'<br />  line.gsub(/Python/, 'Ruby') # replace every 'Python' with 'Ruby'<br /><br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:29 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(8)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69165.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69165.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69165.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69165.html</trackback:ping><description><![CDATA[
		<pre>  histogram = Hash.new(0)	##给hash表设置默然值为0<br />  histogram['key1']<br />  histogram['key1'] = histogram['key1'] + 1<br />  histogram['key1']<br /><br />######################################<br />##gets 从命令行出入的文件名得到的文件的每一行文本。<br />while line = gets<br />  puts line.downcase	##downcase全部转换成小写<br />end<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:22 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(7)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69162.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69162.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69162.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69162.html</trackback:ping><description><![CDATA[
		<pre>##数组<br />a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]<br />  a[0]<br />  a[3]<br /># this is the same:<br />  a = %w{ ant bee cat dog elk }<br />  a[0]<br />  a[3]<br /><br />##hash表<br /> inst_section = {<br />    'cello'     =&gt; 'string',<br />    'clarinet'  =&gt; 'woodwind',<br />    'drum'      =&gt; 'percussion',<br />    'oboe'      =&gt; 'woodwind',<br />    'trumpet'   =&gt; 'brass',<br />    'violin'    =&gt; 'string'<br />  }<br /><br />  inst_section['oboe']<br />  inst_section['cello']<br />  inst_section['bassoon']<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:10 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(6)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69160.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69160.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69160.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69160.html</trackback:ping><description><![CDATA[
		<pre> a = [ 1, 'cat', 3.14 ]   # array with three elements<br />  # access the first element<br />  a[0]<br />  # set the third element<br />  a[2] = nil<br />  # dump out the array<br />  a</pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:07 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(5)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69159.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69159.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69159.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69159.html</trackback:ping><description><![CDATA[
		<pre>  def say_goodnight(name)<br />    result = "Good night, #{name}"	##把变量name的值替换进字符串,ruby使用#{var}.<br />    return result<br />  end<br />  puts say_goodnight('Pa')<br />##########################################################<br /><br />  def say_goodnight(name)<br />    result = "Good night, #{name.capitalize}" ##s.capitalize 第一个子母变为大写<br />								      ##s.capitalize!<br />							              ##Returns a copy of s with the first character converted to uppercase and the remainder to lowercase.<br />								      ##"fooBar".capitalize # =&gt; "Foobar"<br />  return result<br />  end<br />  puts say_goodnight('uncle')<br />
##########################################################<br /><br />$greeting = "Hello"        # $greeting is a global variable<br />@name     = "Prudence"     # @name is an instance variable<br />puts "#$greeting, #@name"<br /><br />##########################################################<br />  def say_goodnight(name)	##不用使用return语句也可以返回<br />    "Good night, #{name}"<br />  end<br />  puts say_goodnight('Ma')<br /><br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 15:05 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(4)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69156.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69156.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69156.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69156.html</trackback:ping><description><![CDATA[
		<pre> number = -123	#数字都有Math类的方法<br /> number = number.abs</pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 14:53 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(3)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69155.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69155.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69155.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69155.html</trackback:ping><description><![CDATA[
		<pre>  song = 1<br />  sam = ""<br />  def sam.play(a)	#定义方法<br />    "duh dum, da dum de dum ..."<br />  end</pre>
		<pre>  "gin joint".length	#所有都是以Object为root<br />  "Rick".index("c")<br />  -1942.abs<br />  sam.play(song)</pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 14:50 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(2)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69148.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69148.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69148.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69148.html</trackback:ping><description><![CDATA[
		<pre>class Song<br />def initialize(a) #构造函数<br />end<br />end</pre>
		<pre>song1 = Song.new("Ruby Tuesday")<br />song2 = Song.new("Enveloped in Python")<br /># and so on</pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 14:29 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby code example(1)</title><link>http://www.blogjava.net/ivanwan/archive/2006/09/12/69147.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 12 Sep 2006 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2006/09/12/69147.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/69147.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2006/09/12/69147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/69147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/69147.html</trackback:ping><description><![CDATA[
		<pre>3.times { puts "Hello!" }<br /><br />i.times {| i| ...}<br />Iterates the block i times. ##迭代一个闭包i次<br /></pre>
<img src ="http://www.blogjava.net/ivanwan/aggbug/69147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2006-09-12 14:27 <a href="http://www.blogjava.net/ivanwan/archive/2006/09/12/69147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Martin Fowler：闭包</title><link>http://www.blogjava.net/ivanwan/archive/2005/08/23/10811.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 23 Aug 2005 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2005/08/23/10811.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/10811.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2005/08/23/10811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/10811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/10811.html</trackback:ping><description><![CDATA[&nbsp;随着人们对动态语言兴趣的日益浓厚，越来越多的人都遇到了闭包（Closures ）和或块（Blocks）等概念。有着C/C++/Java/C#等语言背景的人因为这些语言本身没有闭包这个概念，所以可能不太了解闭包。本文将简单的介绍一下闭包的概念，那些有大量支持闭包语言编程经验的人也许觉得本文不会太有意思。
<P>&nbsp;&nbsp;&nbsp; 闭包的概念已经提出很长时间了。我第一次碰到这它是在smalltalk中，那时候还叫做块（blocks）。Lisp语言中用的很多。Ruby中也有同样的功能－这也是Ruby用户喜欢Ruby的一个原因。</P>
<P>&nbsp;&nbsp;&nbsp; 本质上来说，一个闭包是一块代码，它们能作为参数传递给一个方法调用。我将通过一个简单的例子来阐述这个观点。假设我们有一个包含一些雇员对象的列表，然后我想列出职位为经理的员工，这样的员工可以通过IsManager判断。在C#里，我们可能会写出下面类似的代码：</P><PRE>  public static IList Managers(IList emps) {
    IList result = new ArrayList();
    foreach(Employee e in emps)
      if (e.IsManager) result.Add(e);
    return result;
  }
</PRE>
<P>&nbsp;&nbsp;&nbsp; 在一种支持闭包的语言中，比如Ruby，我们可以这样写：</P><PRE>  def managers(emps)
	return emps.select {|e| e.isManager}
  end
  </PRE>
<P>&nbsp;&nbsp;&nbsp; select是Ruby中定义的集合结构中的一个方法，它接受一个block，也就是闭包，作为一个参数。在Ruby中，闭包写在一对大括号中（不止这一种方法，另一种为do .. end）。如果这个块也接受参数，你可以将这些参数放到两个竖线之间。select方法循环迭代给定的数组，对每个元素执行给定的block，然后将每次执行block返回true的元素组成一个新的数组再返回。</P>
<P>&nbsp;&nbsp;&nbsp; 现在，如果你是C程序员你也许要想，通过函数指针也可以实现，如果你是JAVA程序员，你可能回想我可以用匿名内类来实现，而一个C#者则会想到代理（delegate）。这些机制和闭包类似，但是它们和闭包之间有两个明显得区别。</P>
<P>&nbsp;&nbsp;&nbsp; 第一个是形式上的不同（The first one is a formal difference）。闭包可以引用它定义时候可见的变量。看看下面的方法：</P><PRE>def highPaid(emps)
	threshold = 150
	return emps.select {|e| e.salary &gt; threshold}
end
  </PRE>
<P>&nbsp;&nbsp;&nbsp; 注意select的block代码中引用了在包含它的方法中的局部变量，而其它不支持真正闭包的语言使用其它方法达到类似功能的方法则不能这样做。闭包还允许你做更有趣的事情，比如下面方法：</P><PRE>def paidMore(amount)
	return Proc.new {|e| e.salary &gt; amount}
end
</PRE>
<P>&nbsp;&nbsp;&nbsp; 这个方法返回一个闭包，实际上它返回一个依赖于传给它的参数的闭包。我可以用一个参数创建一个这样的方法，然后再把它赋给另一个变量。</P><PRE>highPaid = paidMore(150)
</PRE>
<P>&nbsp;&nbsp;&nbsp; 变量 <CODE><FONT face=新宋体>highPaid</FONT></CODE> 包含了一段代码（在Ruby中是一个Proc对象），这段代码将判断一个对象的salary属性是否大于150。我们可以这样使用这个方法：</P><PRE>john = Employee.new
john.salary = 200
print highPaid.call(john)
  </PRE>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表达式<CODE><FONT face=新宋体>highPaid.call(john)</FONT></CODE>调用我之前定义的代码，这时候此代码中的amount已经在创建这方法的时候绑定为150。即使现在我执行print 的时候，150已经不在它的范围内了，但是amount和150之间的绑定依然存在。</P>
<P>&nbsp;&nbsp;&nbsp; 所以，闭包的第一个关键点是闭包是一段代码加上和定义它的环境之间的绑定（they are a block of code plus the bindings to the environment they came from）。这是闭包和函数指针等其它相似技术的不同点（java匿名内类可以访问局部变量，但是只有当这些内类是final的时候才行）。</P>
<P>&nbsp;&nbsp;&nbsp; 第二个不同点不是定义形式的不同，但是也同样重要。（The second difference is less of a defined formal difference, but is just as important, if not more so in practice）。支持闭包的语言允许你用很少的语法去定义一个闭包，尽管这点可能不是很重要的一点，但我相信这点是至关重要的－这是使得人们能很自然的使用闭包的关键点。看看Lisp，Smalltalk和Ruby，闭包遍布各处－比其它语言中类似的使用多很多。绑定局部变量是它的特点之一，但我想最大的原因是使用闭包的语法和符号非常简单和清楚。</P>
<P>&nbsp;&nbsp;&nbsp; 一个很好的相关例子是从Smalltalk程序员到JAVA程序员，开始时很多人，包括我，试验性的将在Smalltalk中使用闭包的地方在Java中使用匿名内类来实现。但结果使得代码变得混乱难看，所以我们不得不放弃。</P>
<P>&nbsp;&nbsp; 我在Ruby经常使用闭包，但我不打算创建Proc对象，然后传来传去。大多数时间我用闭包来处理前面我提到的select等基于集合对象的方法。闭包另一个重要用途是'execute around method'，比如处理一个文件：</P><PRE>File.open(filename) {|f| doSomethingWithFile(f)}
</PRE>
<P>&nbsp;&nbsp; 这里open方法打开一个文件，然后执行给定的block，然后关闭它。这样处理非常方便，尤其是对事务（要求commit或者rollback），或者其它的你需要在处理结束时候作一些收尾处理的事情。我在我的xml文档转换中广泛使用这个优点。</P>
<P>&nbsp;&nbsp; 闭包的这些用法显然远不如用Lisp语言的人遇到的多，即使我，在使用没有闭包支持的语言的时候，也会想念这些东西。闭包就像一些你第一眼见到觉得不怎么样的东西，但你很快就会喜欢上它们。</P><img src ="http://www.blogjava.net/ivanwan/aggbug/10811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2005-08-23 17:06 <a href="http://www.blogjava.net/ivanwan/archive/2005/08/23/10811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>