﻿<?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-大漠驼铃-随笔分类-Ruby</title><link>http://www.blogjava.net/nkjava/category/43381.html</link><description>置身浩瀚的沙漠，方向最为重要，希望此blog能向大漠驼铃一样，给我方向和指引。
EJB/JPA/JSF/Struts/Spring/Hibernate/Perl/Shell/C/Java
</description><language>zh-cn</language><lastBuildDate>Thu, 25 Mar 2010 17:19:07 GMT</lastBuildDate><pubDate>Thu, 25 Mar 2010 17:19:07 GMT</pubDate><ttl>60</ttl><item><title>Ruby 异常处理(转载)</title><link>http://www.blogjava.net/nkjava/archive/2010/03/25/316503.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 25 Mar 2010 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/03/25/316503.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/316503.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/03/25/316503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/316503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/316503.html</trackback:ping><description><![CDATA[http://jbf034.javaeye.com/blog/221347<br />
异常处理是开发过程中经常要面对的问题，基本所有高级语言都有自己的异常处理系统，ruby也不例外，而且使用起来也非常简单。
<br />
<br />
ruby中异常的抛出是使用的raise方法，记住哦，这是个方法，由ruby Kernel提供的，而不是关键字，同时ruby也为这个方法提供了一个别名fail，可以用fail代替raise，抛出异常的例子如下：
<br />
Ruby代码
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">raise</span><span style="color: #000000;">&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;</span><span style="color: #008000;">#</span><span style="color: #008000;">抛出一个默认的RuntimeError&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Some&nbsp;error&nbsp;message</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">抛出一个消息为"Some&nbsp;error&nbsp;message"的RuntimeError&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;ArgumentError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">抛出一个无消息的ArgumentError&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;ArgumentError,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Bad&nbsp;data</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">抛出一个消息为"Bad&nbsp;data"的ArgumentError&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;ArgumentError.new(</span><span style="color: #800000;">"</span><span style="color: #800000;">Bad&nbsp;data</span><span style="color: #800000;">"</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">同上&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;ArgumentError&nbsp;ArgumentError,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Bad&nbsp;data</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;caller[0]&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">抛出一个包含消息的格式为filename:line&nbsp;或者&nbsp;filename:line:in&nbsp;'method'&nbsp;的异常&nbsp; </span><span style="color: #008000;"><br />
</span></div>
<br />
以上代码中的raise可以使用别名fail代替，在没有明确的给出异常类型时，ruby默认抛出RuntimeError，其中最后一个例子抛出的信息包含了当前错误所在的文件，行数已经所在的方法的信息，这些信息都存储在caller这个数组中，里面包含了方法调用者的相关信息，第一个元素包
含了方法的调用者的信息，第二个信息包含了方法调用者的调用者的信息，以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用
的。 <br />
<br />
Ruby代码
<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;func1&nbsp;&nbsp;<br />
puts&nbsp;caller&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">打印调用者信息&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">end&nbsp;<br />
&nbsp;<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;func2&nbsp;&nbsp;<br />
func1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">第六行&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">end&nbsp;<br />
&nbsp;<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;func3&nbsp;&nbsp;<br />
func2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">第十行&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">end&nbsp;<br />
&nbsp;<br />
func3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">最终调用者，十三行&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">运行结果&nbsp;&nbsp;</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">test.rb:6:in&nbsp;`func2'&nbsp;&nbsp;</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">test.rb:10:in&nbsp;`func3'&nbsp;&nbsp;</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">test.rb:13&nbsp; <br />
</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
<br />
<br />
<br />
从上面的代码可以看出，caller记录了每个调用者所在的文件名，行数以及方法。
<br />
<br />
上面讲解了关于ruby异常抛出的方式以及caller数组的作用，接下来我们来了解一下ruby中是如何进行异常的捕捉的，在java中，异常
的捕捉是在try ... catch当中进行，而ruby则是在begin ...
end代码块中进行异常的捕捉，在该代码块中使用rescue关键字进行捕捉异常类型，注意哦，这个是关键字，而不是方法。 <br />
Ruby代码
<br />
begin&nbsp;
<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;
<br />
rescue&nbsp; errorType1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型&nbsp;&nbsp;
<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;
<br />
rescue&nbsp; errorType2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型&nbsp;&nbsp;
<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;
<br />
end&nbsp;
<br />
<br />
<br />
以上代码就是一个大概的捕捉异常的例子，在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理，可是如果抛出的异常类型并没有显示的捕捉如何处理呢？那就是在最后使用else，如下：
<br />
Ruby代码
<br />
begin&nbsp;
<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;
<br />
rescue&nbsp; errorType1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型&nbsp;&nbsp;
<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;
<br />
rescue&nbsp; errorType2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型&nbsp;&nbsp;
<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;
<br />
else&nbsp;
<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;
<br />
end&nbsp;
<br />
<br />
begin
<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; #可能出现异常的代码
<br />
rescue&nbsp; errorType1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型
<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; #处理异常的代码
<br />
rescue&nbsp; errorType2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #要捕捉的异常类型
<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; #处理异常的代码
<br />
else
<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; #如果以上代码类型都没有捕捉到，则运行该段代码
<br />
end
<br />
<br />
这时又有一个问题，如果我想获取异常信息又该如何做呢？请看下面的代码：
<br />
Ruby代码
<br />
begin&nbsp;
<br />
&nbsp;&nbsp; raise ArgumentError, "Bad data"&nbsp;
<br />
rescue =&gt; err&nbsp;&nbsp;
<br />
&nbsp; puts err&nbsp;&nbsp;
<br />
end&nbsp;
<br />
<br />
<br />
通过rescue =&gt;
variable的方式，就可以将异常保存为一个variable了。又解决了一个问题，还有什么问题呢？啊，对了，在java的使用当中，比如使用
Connection进行数据库连接后，最后一定要进行资源的清理，都是在finally块当中进行的，可是在ruby中又如何进行这些资源的清理呢？看
看下面的代码： <br />
Ruby代码
<br />
begin&nbsp;
<br />
&nbsp;&nbsp; raise ArgumentError, "Bad data"&nbsp;
<br />
rescue =&gt; err&nbsp;&nbsp;
<br />
&nbsp; puts err&nbsp;&nbsp;
<br />
ensure&nbsp;
<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;
<br />
end&nbsp;
<br />
<br />
<br />
从上面代码我们看到，ruby提供了一个关键字ensure，它的作用和java中的finally一样，无论任何异常，该关键字下的代码都必然
会在退出代码块前执行。同时，ruby还提供恢复功能，如果在抛出异常并进行异常处理后我们需要进行恢复工作，那就是使用retry就会重新执行代码块
了。 <br />
<br />
上面提到，异常的捕捉处理必须在begin-end代码块中进行，那是不是无论什么时候都要书写begin-end这两个关键字呢？其实也不是，在 ruby中，方法实际上就是一个隐式的begin-end代码块，所以在方法中进行异常的捕捉和处理，可以省略begin。
<img src ="http://www.blogjava.net/nkjava/aggbug/316503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-03-25 10:11 <a href="http://www.blogjava.net/nkjava/archive/2010/03/25/316503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 操作Excell</title><link>http://www.blogjava.net/nkjava/archive/2010/03/25/316501.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 25 Mar 2010 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/03/25/316501.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/316501.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/03/25/316501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/316501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/316501.html</trackback:ping><description><![CDATA[http://hlee.javaeye.com/blog/407450<br />
http://xineohpanihc.javaeye.com/blog/266670<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/316501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-03-25 09:49 <a href="http://www.blogjava.net/nkjava/archive/2010/03/25/316501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby   采集一些应用</title><link>http://www.blogjava.net/nkjava/archive/2010/02/28/314092.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sun, 28 Feb 2010 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/02/28/314092.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/314092.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/02/28/314092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/314092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/314092.html</trackback:ping><description><![CDATA[前两天朋友说用python做采集比较方便，有现成的包可以用。<br />
今天查资料的时候看到ruby在数据处理和采集方面也有着较强的功能。<br />
<br />
应用比较多的有<br />
spridr<br />
<span style="color: Red;">hpricot</span><br />
nokogiri<br />
http://nokogiri.org/<br />
<br />
<br />
网页交互程序<br />
<br />
Watir<br />
http://bbs.locoy.com/archiver/tid-30408.html<br />
http://www.tsnpc.com/use-watir-for-page-scraping/<br />
<br />
Mechanize<br />
<a href="http://www.danga.com/memcached/download.bml" target="_blank">http://www.javaeye.com/topic/299699</a><br />
<br />
详细的以后应用到再去学习<br />
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/314092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-02-28 09:22 <a href="http://www.blogjava.net/nkjava/archive/2010/02/28/314092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>watir special</title><link>http://www.blogjava.net/nkjava/archive/2010/01/27/311014.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 27 Jan 2010 15:59:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/01/27/311014.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/311014.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/01/27/311014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/311014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/311014.html</trackback:ping><description><![CDATA[<strong><font face="Verdana "><font size="3"><strong><strong>获取窗口对象：</strong>&nbsp;&nbsp;</strong>&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;<br />
&nbsp; &nbsp; 方法1： ie2 = Watir::IE.attach(:url,'http://www.google.cn/')&nbsp; &nbsp;<br />
&nbsp; &nbsp; 方法2： ie3 = Watir::IE.attach(:title,'Google')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp; 方法3： ie4 = Watir::IE.attach(:title, /google.cn/)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<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;<br />
<br />
</font></font></strong><br />
<strong><font face="Verdana "><font size="3"><strong><font face="Verdana "><font color="#080000"><strong>文本框:</strong><br />
</font></font></strong>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;INPUT id="email" name="_fmu.u._0.e" value="" /&gt;<br />
&nbsp; &nbsp;&nbsp;&nbsp;方法1： ie.text_field(:id,'email').set("文本内容")<br />
&nbsp; &nbsp;&nbsp;&nbsp;方法2： ie.text_field(:name, 'email').set("文本内容")<br />
&nbsp; &nbsp;&nbsp;&nbsp;方法3： ie.text_field(:name,"email").clear</font></font></strong><br />
<br />
<strong><font face="Verdana "><font size="3"><font face="Verdana "><strong>下拉框：</strong></font><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;SELECT name="cert_no"&gt; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;OPTION value="身份证"&gt;身份证&lt;/OPTION&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;/SELECT&gt;<br />
&nbsp; &nbsp; 方法1： ie.select_list(:name,"cert_no").select("身份证") <br />
&nbsp; &nbsp; 方法2： ie.select_list(:name,"cert_no").clearSelection</font></font></strong><br />
<br />
<strong><font face="Verdana "><font size="3"><font face="Verdana "><strong>超链接:</strong></font><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;a href = "http://www.google.cn/"&gt;google&lt;/a&gt; <br />
&nbsp; &nbsp; 方法1：ie.link(:text,"google").click <br />
&nbsp; &nbsp; 方法2：ie.link(:url,"http://www.google.cn/").click </font></font></strong><br />
<strong><font face="Verdana "><font size="3">&nbsp; &nbsp; 方法3：ie.link(:id,"test").click </font></font></strong><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>复选框：</strong><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "checkbox" name = "checkme" value = "1"&gt; <br />
&nbsp; &nbsp; 方法1： ie.checkbox(:name,"checkme").set <br />
&nbsp; &nbsp; 方法2： ie.checkbox(:name,"checkme").clear <br />
&nbsp; &nbsp; 方法3： values = ie.checkbox(:name,"checkme").value<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "checkbox" name = "checkme" value = "2"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;#多个同名的复选框处理<br />
&nbsp; &nbsp; 方法1： ie.checkbox(:name,"checkme","2").set <br />
&nbsp; &nbsp; 方法2： ie.checkbox(:name,"checkme","2").clear </font></font></strong><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>单选框：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "radio" name = "clickme" id = "1"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;方法1： ie.radio(:name, "clickme").set <br />
&nbsp; &nbsp;&nbsp;&nbsp;方法2： ie.radio(:name, "clickme").clear</strong></font></font><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>一般按钮：</strong><br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "button" name = "clickme" value = "Click Me"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;方法1： ie.button(:value, "Click Me").click <br />
&nbsp; &nbsp;&nbsp;&nbsp;方法2： ie.button(:name,"clickme").click</font></font></strong><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>submit按钮：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;form action = "submit" name = "submitform" method = "post"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "submit" value = "Submit"&gt;&lt;/input&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;/form&gt; <br />
&nbsp; &nbsp; 方法： ie.button(:value."Submit").click</strong></font></font><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>图片按钮：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;form action ="submit" name = "doitform" method = "post"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;input type = "image" src = "images/doit.gif" name = "doit"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;/form&gt; <br />
&nbsp; &nbsp; 方法：ie.button(:name, "doit").click</strong></font></font><br />
<br />
<strong><font face="Verdana "><font size="3"><strong>Form中无按钮：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;form action = "login" name = "loginform" method = "get"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;input name = "username" type = "text"&gt;&lt;/input&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;/form&gt; <br />
&nbsp; &nbsp; 方法1：ie.form(:name,"loginform").submit <br />
&nbsp; &nbsp; 方法2：ie.form(:action,"login").submit</strong></font></font><br />
<br />
<font face="Verdana "><font size="3"><strong><strong>获取隐含对象值：</strong>&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &lt;INPUT type=hidden value="您的Email" name="field1"&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp;&nbsp;方法：values = ie.hidden(:name,'field1').value&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;<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;<br />
&nbsp;&nbsp;</strong></font></font><font face="Verdana "><font size="3"><strong><strong><strong>URL编码：</strong> </strong>&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp; require 'cgi'&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp; string =&nbsp;&nbsp;"URL编码"&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; <br />
&nbsp; &nbsp;&nbsp; &nbsp; string = CGI::escape(string)&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; <br />
&nbsp; &nbsp;&nbsp; &nbsp; puts string&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <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;<br />
<strong><strong>URL解码：</strong>&nbsp; &nbsp;</strong>&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp;require 'cgi'&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp; string =&nbsp;&nbsp;"URL%BD%E2%C2%EB"&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp; string = CGI::unescape(string)&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;<br />
&nbsp; &nbsp;&nbsp; &nbsp; puts string&nbsp; &nbsp;&nbsp; &nbsp; </strong></font></font></strong></strong></strong></strong>
<img src ="http://www.blogjava.net/nkjava/aggbug/311014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-01-27 23:59 <a href="http://www.blogjava.net/nkjava/archive/2010/01/27/311014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gem相关命令</title><link>http://www.blogjava.net/nkjava/archive/2010/01/27/310920.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 27 Jan 2010 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/01/27/310920.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/310920.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/01/27/310920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/310920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/310920.html</trackback:ping><description><![CDATA[<font face="Verdana "><font size="4"><font face="Verdana ">显示gem的帮助：<font color="#080000">gem &#8211;h</font>&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;显示gem版本号：<font color="#080000">gem &#8211;v</font><br />
&nbsp; &nbsp;&nbsp; &nbsp;更新gem版本：<font color="#080000">gem update --system </font><br />
&nbsp; &nbsp;&nbsp; &nbsp;安装watir包：<font color="#080000">gem install watir</font><br />
&nbsp; &nbsp;&nbsp; &nbsp;运行build子命令构建gem包：<font color="#080000">gem build package.gemspec</font><br />
&nbsp; &nbsp;&nbsp; &nbsp;列出安装的gems：<font color="#080000">gem list <br />
</font>&nbsp; &nbsp;&nbsp; &nbsp;检查已安装的gem包：<font color="#080000">gem check</font><br />
&nbsp; &nbsp;&nbsp; &nbsp;卸载已安装的gem包：<font color="#080000">gem uninstall GEMNAME<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp; gem server 查看文档资料<br />
</font></font></font></font><font size="4">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;oci&nbsp;&nbsp;Oracle 的 <font color="#c60a00">OCI</font>8 接口连接 Oracle 数据库的接口<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ocra 和 rubyscript2exe是把rb编译成可执行文件<br />
</font>
<div id="message11767412" class="t_msgfont">显示已经安装的包<br />
gem list --local<br />
显示没有安装的包<br />
gem list --remote</div>
<font size="4"><br />
</font>
<img src ="http://www.blogjava.net/nkjava/aggbug/310920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-01-27 12:27 <a href="http://www.blogjava.net/nkjava/archive/2010/01/27/310920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby学习1-字符串</title><link>http://www.blogjava.net/nkjava/archive/2010/01/03/308088.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sun, 03 Jan 2010 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/01/03/308088.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/308088.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/01/03/308088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/308088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/308088.html</trackback:ping><description><![CDATA[1，切片：silce, [ ]-----------------[ ]是silce的别名，所以两者是完全相同的<br />
操作1：判定字符串中是否含有字串/子模式<br />
string[substring]<br />
string[/pattern/]<br />
string[/pattern/, position] #position之后的子串中是否含有/pattern/<br />
如果存在返回子串/子模式串，否则返回nil<br />
&#8220;hello world"["hello"]==="hello"<br />
"hello world"[/.*lo/]==="hello"<br />
"hello world"[/en/]===nil<br />
<br />
操作2：使用索引截取子串<br />
string[position] #注意返回的是ASCII码而不是字符<br />
string[start, length]<br />
string[start..end]<br />
string[start...end]<br />
<br />
2，比较：<br />
== #比较字符串是否相等<br />
eql? #？？好像没有区别<br />
&lt;=&gt; #用来比较字符串的大小，大于返回 1，小于返回 -1， 否则返回0<br />
<br />
3，字符串的运算<br />
downcase #改变字符串为全部小写<br />
upcase #改变字符串为全部大写<br />
swapcase#反写<br />
capitalize #改变字符串为首字母大写<br />
* #重复字符串<br />
insert num, string #在num位置插入串string(insert没有！，因为insert会直接改变原串）<br />
delete(!) string1 (,string2) #删除string1交string2的字符<br />
gsub find, replace #将串中的find，替换为replace. find可以是正则表达式，replace很显然不可以。注意：是所有相同的都替换，相当与sed中的s/pattern/string/g<br />
replace string #将字符串替换为string, 这是对象没有变，只是其中的内容发生了变化。<br />
<br />
利用切片来改变字符串(silce!, [ ]=)<br />
"hello"["ello"]= "w" # "hw"<br />
"hello"[1]="wan" # "hwanllo"<br />
&#8220;hello"[1..3]= "wrd" #"hwrdo"<br />
"hello"[1...3]= "wr" #"hwrlo"<br />
"hello"[1,3]="wrd" #"hwrdo"<br />
"hello"[/el/]= "wr" #"hwrlo"<br />
<br />
chomp(!) 用来摘除字符串末尾的换行符（如果不是换行符返回空）#注意只能是换行符，空格都不行<br />
chop(!)用来摘除字符串末尾的最后一个字符<br />
reverse(!)首尾倒置<br />
split(/pattern/)将字符串分割成数组，分隔符是/pattern/（注意带！的方法不能用来改变类，所以split没有！）<br />
<br />
<br />
字符串长度<br />
string.length<br />
string.size<br />
<br />
字符串对齐<br />
string.ljust num, char #用char来填充string,不足num的部分。注意左对齐是右填充。如果字符串长度比char大，忽略<br />
string.rjust num, char<br />
string.center num, char<br />
<br />
string.lstring #trim字符串，去除左边空格<br />
string.rstring<br />
string.strip<br />
..........那么如何去掉所有的空格呢？ 很简单，使用gsub，进行替换<br />
<br />
string.next/succ #string+1 不是+1这么简单。"a".next == "zz"<br />
string1.upto(stringn) #string1, string2 ....stringn<br />
<br />
字符串遍历：<br />
string.each #分割不同项的必须是\n "hello\nworld".each {|e| puts e &lt;&lt; ","}===<br />
hello,<br />
world,<br />
"hello world".each{|e| puts e &lt;&lt; ","}===<br />
hello world,<br />
string.each_byte #以字节为单位遍历<br />
<br />
<br />
<br />
求字串的索引位置<br />
string.index substring #正则表达式也可以<br />
<br />
正则表达式专用<br />
string.grep /pattern/ #如果不是正则表达式搜索不到任何东西，如果是且匹配返回包含整个字符串的一个数组<br />
string =~ /pattern/ #pattern第一次出现的位置<br />
string !~ /pattern/ #如果没有找到/pattern返回true(注意！)<br />
<br />
<br />
uby很强大，可是相关资料少而不详细。本文是个人学习总结，测试环境是windows xp sp3 + NetBeans6.7.1(JRuby 1.2.0),主要结论来自于互联网、"Programming Ruby"2e、对于源代码的分析和实测代码。
<h1>双引号字符串和单引号字符串</h1>
<p>都能表示字符串对象，区别在于双引号字符串能够支持更多的转义字符。下面的代码在字符串中增加了'符号。<br />
str=&#8216;he'lo&#8217; <br />
puts str<br />
显示结果为he'lo。<br />
<br />
单引号仅支持\\ =&gt; \ 和 \' =&gt; '<br />
<br />
下表是ruby中双引号字符串支持的转义字符：</p>
<div id="cvon" style="text-align: left;"><img style="width: 648px; height: 294.714px;" src="http://docs.google.com/File?id=dqsbw4c_480kbnp2ghd_b" alt="" />
</div>
<h1>分界符</h1>
<p><br />
&nbsp;&nbsp; &nbsp;所有不是字母或者数字的单字节字符都可以成为String的分界符。注意，通常他们都是成对出现的，比如&lt;和&gt;,!和!,{和}等。</p>
<h1>构造字符串字面量</h1>
<p>方法一：<br />
最简单的使用单引号或者双引号括起来的字符串，比如"hello"。<br />
<br />
方法二：<br />
使用%q配合分界符，%q代表单引号<br />
str=%q!he\lo!<br />
<br />
方法三：<br />
使用%Q配合分界符，%Q代表双引号<br />
str=%Q{he\lo}<br />
<br />
方法四：<br />
here document构建字符串，该方法比较适合用于多行字符串的创建。由&lt;&lt;和边界字符串作为开头，由边界字符串作为结尾，比如下列代码：<br />
str = &lt;&lt;END_OF_STRING1<br />
&nbsp; We are here now,<br />
&nbsp; where are you?<br />
END_OF_STRING1<br />
puts str<br />
输出结果为：<br />
&nbsp; We are here now,<br />
&nbsp; where are you?<br />
<br />
较为复杂的是允许多个边界字符串对出现。<br />
str = &lt;&lt;END_OF_STRING1,&lt;&lt;END_OF_STRING2<br />
&nbsp; We are here now,<br />
&nbsp; where are you?<br />
END_OF_STRING1<br />
&nbsp; I will leave now,<br />
&nbsp; would you like to go with me?<br />
END_OF_STRING2<br />
<br />
puts str<br />
输出结果为：<br />
&nbsp; We are here now,<br />
&nbsp; where are you?<br />
&nbsp; I will leave now,<br />
&nbsp; would you like to go with me?</p>
<h1>字面量与copy-on-write技术<br />
</h1>
<p>
<br />
&nbsp;&nbsp;&nbsp; 在Java中，如果两个String对象a和b的值都是"abcdef",如下：<br />
String a="abcdef";<br />
String b="abcdef";<br />
那
么，JVM只会创建一个常量对象"abcdef",让a和b都指向它。但是在ruby中，采用了智能指针（熟悉c++的朋友清楚）的一个高级技术
copy-on-write，一开始也是共享同一个字符常量，但是一旦之后某个对象（比如b对象)进行了修改操作，则"abcdef"将产生一个副本，b
的修改操作在这个副本上进行。<br />
&nbsp;&nbsp;&nbsp; 更详细的讨论请参考http://developer.51cto.com/art/200811/98630.htm。</p>
<h1>和Java的一些其他区别</h1>
<p>
&nbsp;&nbsp;&nbsp; Java的String每次执行修改操作，都不会改变自身，而是创建一个新的String对象，而Ruby每次的修改操作都会修改自身。</p>
<h1>计算长度</h1>
<p>
puts "hello".length<br />
&nbsp;&nbsp;&nbsp; 该句输出5，是字符个数，不要和C函数搞混，C函数经常用0结束字符串，因此长度经常为实际字符个数+1，Ruby中没有这个习惯。</p>
<h1>查找</h1>
<h2>从左向右查找第一个</h2>
<p>
&nbsp;&nbsp;&nbsp; index方法有三种重载，分别是：<br />
<a href="http://www.ruby-doc.org/core/classes/String.src/M000784.html" target="Code" class="method-signature"><span class="method-name">str.index(substring [, offset])   =&gt; fixnum or nil<br />
str.index(fixnum [, offset])      =&gt; fixnum or nil<br />
str.index(regexp [, offset])      =&gt; fixnum or nil</span>
</a>
<br />
&nbsp;&nbsp;&nbsp; 第二个参数offset是可选参数，不用的话则从索引0的字符开始查找。<br />
puts "hello".index("el") 输出为1 ，注意这里的'el'也可以。也可以只查一个字符比，如puts "hello".index(101) 输出为1，这时候第一个参数为'e'的二进制码。<br />
也可以使用正则表达式进行查找，比如puts "hello".index(/[az]/) 输出为nil，因为"hello"不包含a或者z。[]是正则表达式的运算符，代表里面的a和z有一个找到即可。<br />
puts "hello".index(/lo/) 这个没有[]符号，因此是查找子字符串lo，结果为3.<br />
&nbsp;&nbsp;&nbsp; 我个人觉得尽量熟练使用正则表达式查找是最好的选择，既可以完成简单查找，也可以完成难度查找。不过需要付出不少努力去学习。<br />
&nbsp;&nbsp;&nbsp; 下面这个例子puts "hello".index('o', -1) 证明了第二个参数可以为负数，虽然这没有什么意义，因为功能和为0等价。<br />
&nbsp;&nbsp;&nbsp; 如果查找不到，返回nil。</p>
<h2>逆向查找（从左向右查找最后一个还是从右向左查找第一个） <br />
</h2>
<p>
<a href="http://www.ruby-doc.org/core/classes/String.src/M000785.html" target="Code" class="method-signature"><span class="method-name">str.rindex(substring [, fixnum])   =&gt; fixnum or nil<br />
str.rindex(fixnum [, fixnum])   =&gt; fixnum or nil<br />
str.rindex(regexp [, fixnum])   =&gt; fixnum or nil</span>
</a>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;
第一个参数和index相同，第二个参数是可选，如果不用则默认为字符串尾部。如果为0呢？则从第一个字符开始向右查找。如果为负数呢？这时候很奇怪，居
然能查到。通过看C的实现代码，发现当fixnum&lt;0时，会执行这个运算：fixnum+=substring.length，然后就能找到。逻
辑上可以理解为当fixnum&lt;0时，将从最右边开始向左移动abs(fixnum)-1个位置，并作为最后查找范围，然后开始从左至右进行查找。
字符串最右边的字符的位置被-1代表。<br />
下面两行代码结果都是nil:<br />
puts "hlloe".rindex('e', -2)<br />
puts "hlloe".rindex('e', 3)<br />
<br />
下面两行代码结果都是1：<br />
puts "hello".rindex('e', -2)<br />
puts "hello".rindex('e', 3)<br />
<br />
&nbsp;&nbsp;&nbsp;
注意，以上的代码理解是我个人观察代码后的猜测，因为我还不会调试运行ruby的C代码，所以不一定正确。代码摘录如下：（代码是ruby网站公布的C代
码，但是我所用的平台其实NetBeans6.7.1，因此真正代码应该是Java实现的JRuby1.2.0，这里的C代码仅供参考）<br />
static VALUE<br />
rb_str_rindex_m(argc, argv, str)<br />
&nbsp;&nbsp;&nbsp; int argc;<br />
&nbsp;&nbsp;&nbsp; VALUE *argv;<br />
&nbsp;&nbsp;&nbsp; VALUE str;<br />
{<br />
&nbsp;&nbsp;&nbsp; VALUE sub;<br />
&nbsp;&nbsp;&nbsp; VALUE position;<br />
&nbsp;&nbsp;&nbsp; long pos;<br />
<br />
&nbsp;&nbsp;&nbsp; if (rb_scan_args(argc, argv, "11", &#8834;, &amp;position) == 2) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = NUM2LONG(position);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos += RSTRING(str)-&gt;len;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TYPE(sub) == T_REGEXP) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rb_backref_set(Qnil);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Qnil;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &gt; RSTRING(str)-&gt;len) pos = RSTRING(str)-&gt;len;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = RSTRING(str)-&gt;len;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; switch (TYPE(sub)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case T_REGEXP:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (RREGEXP(sub)-&gt;len) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = rb_reg_adjust_startpos(sub, str, pos, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = rb_reg_search(sub, str, pos, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &gt;= 0) return LONG2NUM(pos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case T_STRING:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = rb_str_rindex(str, sub, pos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &gt;= 0) return LONG2NUM(pos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case T_FIXNUM:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int c = FIX2INT(sub);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *p = (unsigned char*)RSTRING(str)-&gt;ptr + pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *pbeg = (unsigned char*)RSTRING(str)-&gt;ptr;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos == RSTRING(str)-&gt;len) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos == 0) return Qnil;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --p;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (pbeg &lt;= p) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*p == c) return LONG2NUM((char*)p - RSTRING(str)-&gt;ptr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Qnil;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
<br />
<br />
通常我们理解为从右边开始查找，但是注释却表明是从左向右查找，并返回最后一个找到的目标的位置。究竟内幕如何，只能看代码。<br />
<span style="font-family: Courier New;">01161 <span class="keyword">static</span>
<span class="keywordtype">long</span>
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="l01162"></a>
<a href="http://www.ruby-doc.org/doxygen/current/string_8c.html#a71" class="code">01162</a>
<a href="http://www.ruby-doc.org/doxygen/current/string_8c.html#a71" class="code">rb_str_rindex</a>
(str, sub, pos)<br />
01163     <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga0" class="code">VALUE</a>
str, sub;<br />
01164     <span class="keywordtype">long</span>
pos;<br />
01165 {<br />
01166     <span class="keywordtype">long</span>
len = <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(sub)-&gt;len;<br />
01167     <span class="keywordtype">char</span>
*s, *sbeg, *t;<br />
01168 <br />
01169     <span class="comment">/* substring longer than string */</span>
<br />
01170     <span class="keywordflow">if</span>
(<a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(str)-&gt;len &lt; len) <span class="keywordflow">return</span>
-1;<br />
01171     <span class="keywordflow">if</span>
(<a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(str)-&gt;len - pos &lt; len) {<br />
01172         pos = <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(str)-&gt;len - len;<br />
01173     }<br />
01174     sbeg = <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(str)-&gt;ptr;<br />
01175     s = <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(str)-&gt;ptr + pos;<br />
01176     t = <a href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
(sub)-&gt;ptr;<br />
01177     <span class="keywordflow">if</span>
(len) {<br />
01178         <span class="keywordflow" style="color: #ff0000;">while</span>
<span style="color: #ff0000;"> (sbeg &lt;= s) {</span>
<br style="color: #ff0000;" />
<span style="color: #ff0000;">01179             </span>
<span class="keywordflow" style="color: #ff0000;">if</span>
<span style="color: #ff0000;"> (</span>
<a style="color: #ff0000;" href="http://www.ruby-doc.org/doxygen/current/group__ruby__re.html#ga23" class="code">rb_memcmp</a>
<span style="color: #ff0000;">(s, t, len) == 0) {</span>
<br style="color: #ff0000;" />
<span style="color: #ff0000;">01180                 </span>
<span class="keywordflow" style="color: #ff0000;">return</span>
<span style="color: #ff0000;"> s - </span>
<a style="color: #ff0000;" href="http://www.ruby-doc.org/doxygen/current/group__ruby.html#ga151" class="code">RSTRING</a>
<span style="color: #ff0000;">(str)-&gt;ptr;</span>
<br style="color: #ff0000;" />
<span style="color: #ff0000;">01181             }</span>
<br style="color: #ff0000;" />
<span style="color: #ff0000;">01182             s--;</span>
<br style="color: #ff0000;" />
<span style="color: #ff0000;">01183         }</span>
<br />
01184         <span class="keywordflow">return</span>
-1;<br />
01185     }<br />
01186     <span class="keywordflow">else</span>
{<br />
01187         <span class="keywordflow">return</span>
pos;<br />
01188     }<br />
01189 }<br />
<br />
&nbsp;&nbsp;&nbsp; 通过看代码，发现s--;因此，是从右向左进行匹配，找到的第一个就返回。写注释的人应该枪毙!虽然看上去意思一样，但是算法的时间复杂度大不一样。从左到右的查找总是O(n),而从右到左的最坏事件复杂度才是O(n)。<br />
</span>
</p>
<h2>大小写不区分查找</h2>
<p>
&nbsp;&nbsp; &nbsp;puts "hello".upcase.index("H")，利用downcase或者upcase全部转换成小写或者大写，然后再查找。</p>
<h2>正则表达式匹配查找</h2>
<p>
operator =~ 将返回匹配的模式开始位置，如果没有找到则返回nil。<br />
puts "abcde789" =~ /d/<br />
输出5.</p>
<h1>提取子字符串</h1>
<p>
str="hello"<br />
puts str[0,2]<br />
第一个参数是子字符串首字母的Index，第二个是长度（不能为负数）。<br />
结果为he。<br />
第一个参数可以为负数，会把最右边的字符作为-1，然后向左增加-1的方式查找起始位置，比如：<br />
str="hello"<br />
puts str[-2,2]<br />
输出为lo，这种情况我们在rindex方法中已经看到过了。<br />
<br />
也可以使用正则表达式进行提取，这真的很强大。<br />
str="hello"<br />
puts str[/h..l/]<br />
输出为hell。<br />
<br />
符号.代表一个字符，两个.代表两个字符。两个/里面的内容就是正则表达式。.*代表可以有无数个字符，比如<br />
str="hello"<br />
puts str[/h.*o/]<br />
输出为hello。</p>
<h1>字符计数</h1>
<p>
String#count用来计算我们参数中给出的字符集中字符出现的总次数，比如最简单的情况：<br />
str = "hello,world"<br />
puts str.count "w"<br />
&nbsp;&#8220;w" 参数代表的是一个字符结合，里面只有一个字符w，count方法计算出w出现在"hello,world"的次数是1，因此输出为1。<br />
下面我们的参数里面包含了三个字符：<br />
str = "hello,world"<br />
puts str.count "wld"<br />
输出为5，w出现1次，l出现3次，d出现1次，正好5次。<br />
<br />
也可以传递多个参数，每个参数代表一个字符集合，这时候这些字符集合的交集作为count计算的条件：<br />
str = "hello,world"<br />
puts str.count "lo","o"<br />
输出为2。<br />
str = "hello,world"<br />
puts str.count "lo","o"," "<br />
输出为0，因为三个集合的交集为空，所以计算结果为0.<br />
<br />
注意，如果参数^o,代表o出现的次数不计算。</p>
<h1>删除末尾分隔符</h1>
<p>
String#chomp方法有一个字符串参数，指定了要在末尾删除的子字符串。如果不用这个参数，则会将字符串末尾的n,r和rn删除（如果有的话）。</p>
<h1>压缩重复字符</h1>
<p>
String#squeeze方法如果不用参数，则会将字符串中的任何连续重复字符变成单一字符，如下：<br />
str = "helllloo"<br />
puts str.squeeze<br />
输出：helo。<br />
如果传递字符串参数，含义同count方法的参数一样，代表了一个字符集合，则将符合条件（1，在字符集合中出现；2，在字符串中连续出现）的子字符串压缩成的单一字符<br />
实例代码如下：<br />
str = "helllloo"<br />
puts str.squeeze('l')<br />
puts str.squeeze('a-l')<br />
puts str.squeeze('lo')<br />
输出为：<br />
heloo<br />
heloo<br />
helo<br />
<br />
&nbsp;&nbsp;&nbsp; 参数也可以用a-z方式表示在某个字符集合区间内。<br />
<br />
一个很常用的功能是利用squeeze(" ")对字符串内重复的空白字符进行压缩。</p>
<h1>字符串删除</h1>
<h2>delete方法</h2>
<p>
可以接收多个参数，每个参数代表一个字符集合，类似count方法。如果有多个参数，取交集，然后从字符串中删除所有出现在交集中的字符。<br />
<span style="font-family: Courier New;">"hello".delete "l","lo"        #=&gt; "heo"<br />
"hello".delete "lo"            #=&gt; "he"<br />
"hello".delete "aeiou", "^e"   #=&gt; "hell"<br />
"hello".delete "ej-m"          #=&gt; "ho"<br />
</span>
</p>
<h2>利用sub和gsub</h2>
<p>
参见后面的sub用法，使用''进行替换即可。<br />
</p>
<h1>字符串拆分</h1>
<p>
String#split接收两个参数，第一个参数总是被作为间隔符来拆分字符串，并且不会出现在结果中。<br />
第一个参数如果是正则表达式的话，如果为空，则每个字符都被拆开，返回一个字符数组。例子代码如下：<br />
str = "hello"<br />
puts str.split(//)<br />
输出为：<br />
h<br />
e<br />
l<br />
l<br />
o<br />
<br />
&nbsp;&nbsp;&nbsp; 如果正则表达式不为空，则根据匹配的情况进行拆分。例子代码如下：<br />
str = "hello"<br />
puts str.split(/h/)<br />
结果为：<br />
<br />
ello<br />
<br />
拆分成了两个数组，第一个为""，第二个为ello，用h进行拆分的。<br />
第一个参数的另一种用法很简单，只是一个字符串，用于作为间隔符进行拆分，就不举例子了。我更倾向于使用强大的正则表达式。<br />
<br />
第二个参数是一个整数，用于对拆分的结果数组的元素个数进行限制，这个功能有多大用处，我现在到没有体会，一般情况下不用即可。</p>
<h1>大小写转换</h1>
<p>
&nbsp;&nbsp;&nbsp; 如前面出现的，利用downcase或者upcase方法即可。</p>
<h1>数组操作</h1>
<p>
使用[]，里面填上Index，就可以获取第Index个元素。</p>
<h1>和数值类型的相互转换</h1>
<p>
<br />
获取单字节字符的二进制码<br />
puts ?e<br />
？运算符用于中文是非法的。</p>
<h1>字符串迭代</h1>
<p>
Ruby迭代器的设计不在这里讨论，我会专门有一篇文章描述。</p>
<h2>each_char</h2>
<p>
迭代每个字符，下面是示例代码：<br />
require 'jcode' #NetBeans6.7.1和JRuby1.2.0需要，否则下面代码找不到方法<br />
"hello".each_char(){ |c| print c,' ' } #()可以不写<br />
<br />
|c| 代表字符串中的当前字符。</p>
<h2>each</h2>
<p>
迭代每个子字符串，如果不传递seperator参数，则默认用n作为seperator。<br />
"hellonworld".each { |c| puts c }<br />
输出为：<br />
hello<br />
world<br />
<br />
如果传递了有效的字符串作为seperator参数，那么就以这个seperator代替n进行子字符串的迭代：<br />
"hellonworld".each('l') { |s| p s }<br />
输出为：<br />
"hel"<br />
"l"<br />
"onworl"<br />
"d"</p>
<h2>each_byte</h2>
<p>
用法和each_char类似，不过迭代的对象是char，因此输出的是二进制数值。<br />
"hellonworld".each_byte { |s| print s," " }<br />
输出：<br />
104 101 108 108 111 10 119 111 114 108 100</p>
<h2>each_line</h2>
<p>
用法和前面相同，只是用换行符分割子字符串进行迭代：<br />
"hellonworld".each_line do |s|<br />
&nbsp; print s<br />
end<br />
&nbsp;&nbsp;&nbsp; 注意，这是另一种写法，用do/end替换了{/}对。<br />
输出为：<br />
hello<br />
world<br />
只所以输出为两行，是因为第一个子字符串是"hellon"输出后自动换行。</p>
<h1>字符串拼接</h1>
<h2>使用operator +操作</h2>
<p>
str1="hello,"<br />
str2="world"<br />
str3=str1+str2<br />
puts str3<br />
输出为hello,world</p>
<h2>使用operator &lt;&lt;操作</h2>
<p>
str1="hello,"<br />
str2="world"<br />
str1&lt;<br />
puts str1<br />
输出为hello,world</p>
<h2>concat方法</h2>
<p>
concat方法可以在字符串后面加上一个二进制值为[0,255]的字符，用法如下：<br />
str1="hello,world"<br />
str1.concat(33)#33是!的二进制值<br />
puts str1<br />
输出为hello,world!<br />
<br />
concat也可以接一个object，比如另一个String对象</p>
<h1>是否为空</h1>
<p>
String#empty? 方法 如果为空返回true，否则返回false</p>
<h1>字符串比较</h1>
<h2>operator&lt;=&gt;操作</h2>
<p>
str1&lt;=&gt;str2<br />
如果str1小于str2，返回-1；<br />
如果str1等于str2，返回0；<br />
如果str1大于str2，返回1。<br />
<br />
官方注释写反了。</p>
<h2>operator==操作</h2>
<p>
两个比较对象必须都为String，否则返回false;<br />
如果都是String对象，则调用operator &lt;=&gt; 操作符进行比较，比较结果为0时，返回true，否则返回false<br />
</p>
<h1>字符串替换</h1>
<h2>replace方法</h2>
<p>
和operator = 功能相同，字符串内容的完全替换，没什么作用。<br />
<br />
</p>
<h2>sub方法</h2>
<p>
<a href="http://www.ruby-doc.org/core/classes/String.src/M000816.html" target="Code" class="method-signature"><span class="method-name">str.sub(pattern, replacement)         =&gt; new_str<br />
str.sub(pattern) {|match| block }     =&gt; new_str</span>
</a>
<br />
<br />
在str副本上将找到的第一个匹配字符（串）用replacement替换，并返回。比如：<br />
puts "abcde789".sub(/d/, "000")<br />
输出为：abcde00089<br />
<br />
第二种重载形式允许执行一段代码，比如：<br />
puts "abcde789".sub(/d/){|c| 'a'}<br />
找到的字符用|c|表示，可以替换成a字符<br />
输出为：abcdea89</p>
<h2>gsub方法</h2>
和sub的区别在于所有匹配的地方都会被替换，而不只是第一个。<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/308088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-01-03 16:22 <a href="http://www.blogjava.net/nkjava/archive/2010/01/03/308088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>