??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99欧美,2019中文字幕在线视频,91精品专区http://www.aygfsteel.com/nkjava/category/43381.html|n瀚的沙漠Q方向最为重要,希望此blog能向大漠驼铃一Pl我方向和指引? EJB/JPA/JSF/Struts/Spring/Hibernate/Perl/Shell/C/Java zh-cnThu, 25 Mar 2010 17:19:07 GMTThu, 25 Mar 2010 17:19:07 GMT60Ruby 异常处理(转蝲)http://www.aygfsteel.com/nkjava/archive/2010/03/25/316503.html草原上的骆驼草原上的骆驼Thu, 25 Mar 2010 02:11:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/03/25/316503.htmlhttp://www.aygfsteel.com/nkjava/comments/316503.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/03/25/316503.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/316503.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/316503.html 异常处理是开发过E中l常要面对的问题Q基本所有高U语a都有自己的异常处理系l,ruby也不例外Q而且使用h也非常简单?

ruby中异常的抛出是用的raiseҎQ记住哦Q这是个ҎQ由ruby Kernel提供的,而不是关键字Q同时ruby也ؓq个Ҏ提供了一个别名failQ可以用fail代替raiseQ抛出异常的例子如下Q?
Ruby代码
raise                                     #抛出一个默认的RuntimeError  
raise "Some error message"                #抛出一个消息ؓ"Some error message"的RuntimeError  
raise ArgumentError                       #抛出一个无消息的ArgumentError  
raise ArgumentError, "Bad data"           #抛出一个消息ؓ"Bad data"的ArgumentError  
raise ArgumentError.new("Bad data")       #同上  
raise ArgumentError ArgumentError, "Bad data", caller[0]  #抛出一个包含消息的格式为filename:line 或?nbsp;filename:line:in 'method' 的异?nbsp;

以上代码中的raise可以使用别名fail代替Q在没有明确的给出异常类型时Qruby默认抛出RuntimeErrorQ其中最后一个例子抛出的信息包含了当前错误所在的文gQ行数已l所在的Ҏ的信息,q些信息都存储在callerq个数组中,里面包含了方法调用者的相关信息Q第一个元素包 含了Ҏ的调用者的信息Q第二个信息包含了方法调用者的调用者的信息Q以此类推。这个数l在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有? 的?

Ruby代码
  
def func1  
puts caller              
#打印调用者信?nbsp; 
end 
 
def func2  
func1                    
#W六?nbsp; 
end 
 
def func3  
func2                    
#W十?nbsp; 
end 
 
func3                    
#最l调用者,十三?nbsp; 
 
#q行l果  
#
test.rb:6:in `func2'  
#
test.rb:10:in `func3'  
#
test.rb:13 
      



从上面的代码可以看出Qcaller记录了每个调用者所在的文g名,行数以及Ҏ?

上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何q行异常的捕捉的Q在java中,异常 的捕捉是在try ... catch当中q行Q而ruby则是在begin ... end代码块中q行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,q个是关键字Q而不是方法?
Ruby代码
begin 
    ......                               #可能出现异常的代?nbsp; 
rescue  errorType1            #要捕捉的异常cd  
    ......                               #处理异常的代?nbsp; 
rescue  errorType2            #要捕捉的异常cd  
    ......                               #处理异常的代?nbsp; 
end 


以上代码是一个大概的捕捉异常的例子,在begin和end代码块中通过rescueq行异常cd的捕捉然后进行适当的处理,可是如果抛出的异常类型ƈ没有昄的捕捉如何处理呢Q那是在最后用elseQ如下:
Ruby代码
begin 
    ......                               #可能出现异常的代?nbsp; 
rescue  errorType1            #要捕捉的异常cd  
    ......                               #处理异常的代?nbsp; 
rescue  errorType2            #要捕捉的异常cd  
    ......                               #处理异常的代?nbsp; 
else 
    ......                               #如果以上代码cd都没有捕捉到Q则q行该段代码  
end 

begin
    ......                               #可能出现异常的代?
rescue  errorType1            #要捕捉的异常cd
    ......                               #处理异常的代?
rescue  errorType2            #要捕捉的异常cd
    ......                               #处理异常的代?
else
    ......                               #如果以上代码cd都没有捕捉到Q则q行该段代码
end

q时又有一个问题,如果我想获取异常信息又该如何做呢Q请看下面的代码Q?
Ruby代码
begin 
   raise ArgumentError, "Bad data" 
rescue => err  
  puts err  
end 


通过rescue => variable的方式,可以将异常保存Z个variable了。又解决了一个问题,q有什么问题呢Q啊Q对了,在java的用当中,比如使用 Connectionq行数据库连接后Q最后一定要q行资源的清理,都是在finally块当中进行的Q可是在ruby中又如何q行q些资源的清理呢Q看 看下面的代码Q?
Ruby代码
begin 
   raise ArgumentError, "Bad data" 
rescue => err  
  puts err  
ensure 
  ...                       #执行清理工作  
end 


从上面代码我们看刎ͼruby提供了一个关键字ensureQ它的作用和java中的finally一P无论M异常Q该关键字下的代码都必然 会在退Z码块前执行。同Ӟrubyq提供恢复功能,如果在抛出异常ƈq行异常处理后我们需要进行恢复工作,那就是用retry׃重新执行代码? 了?

上面提到Q异常的捕捉处理必须在begin-end代码块中q行Q那是不是无Z么时候都要书写begin-endq两个关键字呢?其实也不是,?ruby中,Ҏ实际上就是一个隐式的begin-end代码块,所以在Ҏ中进行异常的捕捉和处理,可以省略begin?

草原上的骆驼 2010-03-25 10:11 发表评论
]]>
Ruby 操作Excellhttp://www.aygfsteel.com/nkjava/archive/2010/03/25/316501.html草原上的骆驼草原上的骆驼Thu, 25 Mar 2010 01:49:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/03/25/316501.htmlhttp://www.aygfsteel.com/nkjava/comments/316501.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/03/25/316501.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/316501.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/316501.html http://xineohpanihc.javaeye.com/blog/266670


草原上的骆驼 2010-03-25 09:49 发表评论
]]>
Ruby 采集一些应?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/nkjava/archive/2010/02/28/314092.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/314092.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2010/02/28/314092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/314092.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/314092.html</trackback:ping><description><![CDATA[前两天朋友说用python做采集比较方便,有现成的包可以用?br /> 今天查资料的时候看到ruby在数据处理和采集斚w也有着较强的功能?br /> <br /> 应用比较多的?br /> spridr<br /> <span style="color: Red;">hpricot</span><br /> nokogiri<br /> http://nokogiri.org/<br /> <br /> <br /> |页交互E序<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 target="_blank">http://www.javaeye.com/topic/299699</a><br /> <br /> 详细的以后应用到再去学习<br /> <br /> <img src ="http://www.aygfsteel.com/nkjava/aggbug/314092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2010-02-28 09:22 <a href="http://www.aygfsteel.com/nkjava/archive/2010/02/28/314092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>watir specialhttp://www.aygfsteel.com/nkjava/archive/2010/01/27/311014.html草原上的骆驼草原上的骆驼Wed, 27 Jan 2010 15:59:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/01/27/311014.htmlhttp://www.aygfsteel.com/nkjava/comments/311014.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/01/27/311014.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/311014.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/311014.html获取H口对象Q?/strong>                                                                                  
    Ҏ1Q?ie2 = Watir::IE.attach(:url,'http://www.google.cn/')   
    Ҏ2Q?ie3 = Watir::IE.attach(:title,'Google')                 
    Ҏ3Q?ie4 = Watir::IE.attach(:title, /google.cn/)         
                                                                                                


文本?
         <INPUT id="email" name="_fmu.u._0.e" value="" />
     Ҏ1Q?ie.text_field(:id,'email').set("文本内容")
     Ҏ2Q?ie.text_field(:name, 'email').set("文本内容")
     Ҏ3Q?ie.text_field(:name,"email").clear


下拉框:
         <SELECT name="cert_no">
           <OPTION value="w䆾?>w䆾?lt;/OPTION>
         </SELECT>
    Ҏ1Q?ie.select_list(:name,"cert_no").select("w䆾?)
    Ҏ2Q?ie.select_list(:name,"cert_no").clearSelection


链?
           <a >google</a>
    Ҏ1Qie.link(:text,"google").click
    Ҏ2Qie.link(:url,"http://www.google.cn/").click

    Ҏ3Qie.link(:id,"test").click

复选框Q?/strong>
          <input type = "checkbox" name = "checkme" value = "1">
    Ҏ1Q?ie.checkbox(:name,"checkme").set
    Ҏ2Q?ie.checkbox(:name,"checkme").clear
    Ҏ3Q?values = ie.checkbox(:name,"checkme").value
                      <input type = "checkbox" name = "checkme" value = "2">
     #多个同名的复选框处理
    Ҏ1Q?ie.checkbox(:name,"checkme","2").set
    Ҏ2Q?ie.checkbox(:name,"checkme","2").clear


单选框Q?nbsp;         <input type = "radio" name = "clickme" id = "1">
     Ҏ1Q?ie.radio(:name, "clickme").set
     Ҏ2Q?ie.radio(:name, "clickme").clear


一般按钮:
          <input type = "button" name = "clickme" value = "Click Me">
     Ҏ1Q?ie.button(:value, "Click Me").click
     Ҏ2Q?ie.button(:name,"clickme").click


submit按钮Q?nbsp;         <form action = "submit" name = "submitform" method = "post">
             <input type = "submit" value = "Submit"></input>
          </form>
    ҎQ?ie.button(:value."Submit").click


囄按钮Q?nbsp;         <form action ="submit" name = "doitform" method = "post">
             <input type = "image" src = "images/doit.gif" name = "doit">
          </form>
    ҎQie.button(:name, "doit").click


Form中无按钮Q?nbsp;         <form action = "login" name = "loginform" method = "get">
              <input name = "username" type = "text"></input>
          </form>
    Ҏ1Qie.form(:name,"loginform").submit
    Ҏ2Qie.form(:action,"login").submit


获取隐含对象|                                                                                
          <INPUT type=hidden value="您的Email" name="field1">                  
     ҎQvalues = ie.hidden(:name,'field1').value                                             
                                                                                                
  
URL~码Q?/strong>                                                                                       
       require 'cgi'                                                                           
       string =  "URL~码"                                                                     
       string = CGI::escape(string)                                                            
       puts string                                    
                                                                                                
URL解码Q?/strong>                                                                                       
      require 'cgi'                                                                             
       string =  "URL%BD%E2%C2%EB"                                                              
       string = CGI::unescape(string)                                                           
       puts string      


]]>
gem相关命ohttp://www.aygfsteel.com/nkjava/archive/2010/01/27/310920.html草原上的骆驼草原上的骆驼Wed, 27 Jan 2010 04:27:00 GMThttp://www.aygfsteel.com/nkjava/archive/2010/01/27/310920.htmlhttp://www.aygfsteel.com/nkjava/comments/310920.htmlhttp://www.aygfsteel.com/nkjava/archive/2010/01/27/310920.html#Feedback0http://www.aygfsteel.com/nkjava/comments/commentRss/310920.htmlhttp://www.aygfsteel.com/nkjava/services/trackbacks/310920.html昄gem的帮助:gem –h  
      昄gem版本Pgem –v
      更新gem版本Q?font color="#080000">gem update --system

      安装watir包:gem install watir
      q行build子命令构建gem包:gem build package.gemspec
      列出安装的gemsQ?font color="#080000">gem list
      查已安装的gem包:gem check
      卸蝲已安装的gem包:gem uninstall GEMNAME

       gem server 查看文档资料
        oci  Oracle ?OCI8 接口q接 Oracle 数据库的接口
        ocra ?rubyscript2exe是把rb~译成可执行文g
昄已经安装的包
gem list --local
昄没有安装的包
gem list --remote



]]>
Ruby学习1-字符?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/nkjava/archive/2010/01/03/308088.html</guid><wfw:comment>http://www.aygfsteel.com/nkjava/comments/308088.html</wfw:comment><comments>http://www.aygfsteel.com/nkjava/archive/2010/01/03/308088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nkjava/comments/commentRss/308088.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nkjava/services/trackbacks/308088.html</trackback:ping><description><![CDATA[1Q切片:silce, [ ]-----------------[ ]是silce的别名,所以两者是完全相同?br /> 操作1Q判定字W串中是否含有字?子模?br /> string[substring]<br /> string[/pattern/]<br /> string[/pattern/, position] #position之后的子串中是否含有/pattern/<br /> 如果存在q回子串/子模式串Q否则返回nil<br /> “hello world"["hello"]==="hello"<br /> "hello world"[/.*lo/]==="hello"<br /> "hello world"[/en/]===nil<br /> <br /> 操作2Q用烦引截取子?br /> string[position] #注意q回的是ASCII码而不是字W?br /> string[start, length]<br /> string[start..end]<br /> string[start...end]<br /> <br /> 2Q比较:<br /> == #比较字符串是否相{?br /> eql? #Q?好像没有区别<br /> <=> #用来比较字符串的大小Q大于返?1Q小于返?-1Q?否则q回0<br /> <br /> 3Q字W串的运?br /> downcase #改变字符串ؓ全部写<br /> upcase #改变字符串ؓ全部大写<br /> swapcase#反写<br /> capitalize #改变字符串ؓ首字母大?br /> * #重复字符?br /> insert num, string #在num位置插入串string(insert没有Q,因ؓinsert会直接改变原Ԍ<br /> delete(!) string1 (,string2) #删除string1交string2的字W?br /> gsub find, replace #串中的findQ替换ؓreplace. find可以是正则表辑ּQreplace很显然不可以。注意:是所有相同的都替换,相当与sed中的s/pattern/string/g<br /> replace string #字W串替换为string, q是对象没有变,只是其中的内容发生了变化?br /> <br /> 利用切片来改变字W串(silce!, [ ]=)<br /> "hello"["ello"]= "w" # "hw"<br /> "hello"[1]="wan" # "hwanllo"<br /> “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(!) 用来摘除字符串末换行W(如果不是换行W返回空Q?注意只能是换行符Q空格都不行<br /> chop(!)用来摘除字符串末最后一个字W?br /> reverse(!)首尾倒置<br /> split(/pattern/)字W串分割成数l,分隔W是/pattern/Q注意带Q的Ҏ不能用来改变c,所以split没有Q)<br /> <br /> <br /> 字符串长?br /> string.length<br /> string.size<br /> <br /> 字符串对?br /> string.ljust num, char #用char来填充string,不num的部分。注意左寚w是右填充。如果字W串长度比char大,忽略<br /> string.rjust num, char<br /> string.center num, char<br /> <br /> string.lstring #trim字符Ԍ去除左边I格<br /> string.rstring<br /> string.strip<br /> ..........那么如何L所有的I格呢? 很简单,使用gsubQ进行替?br /> <br /> string.next/succ #string+1 不是+1q么单?a".next == "zz"<br /> string1.upto(stringn) #string1, string2 ....stringn<br /> <br /> 字符串遍历:<br /> string.each #分割不同的必须是\n "hello\nworld".each {|e| puts e << ","}===<br /> hello,<br /> world,<br /> "hello world".each{|e| puts e << ","}===<br /> hello world,<br /> string.each_byte #以字节ؓ单位遍历<br /> <br /> <br /> <br /> 求字串的索引位置<br /> string.index substring #正则表达式也可以<br /> <br /> 正则表达式专?br /> string.grep /pattern/ #如果不是正则表达式搜索不CQ何东西,如果是且匚wq回包含整个字符串的一个数l?br /> string =~ /pattern/ #patternW一ơ出现的位置<br /> string !~ /pattern/ #如果没有扑ֈ/patternq回true(注意Q?<br /> <br /> <br /> uby很强大,可是相关资料而不详细。本文是个h学习ȝQ测试环境是windows xp sp3 + NetBeans6.7.1(JRuby 1.2.0),主要l论来自于互联网?Programming Ruby"2e、对于源代码的分析和实测代码? <h1>双引号字W串和单引号字符?/h1> <p>都能表示字符串对象,区别在于双引号字W串能够支持更多的{义字W。下面的代码在字W串中增加了'W号?br /> str=‘he'lo’ <br /> puts str<br /> 昄l果为he'lo?br /> <br /> 单引号仅支持\\ => \ ?\' => '<br /> <br /> 下表是ruby中双引号字符串支持的转义字符Q?/p> <div class="wmqeeuq" 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>分界W?/h1> <p><br />     所有不是字母或者数字的单字节字W都可以成ؓString的分界符。注意,通常他们都是成对出现的,比如<?gt;,!?,{和}{?/p> <h1>构造字W串字面?/h1> <p>Ҏ一Q?br /> 最单的使用单引h者双引号括v来的字符Ԍ比如"hello"?br /> <br /> Ҏ二:<br /> 使用%q配合分界W,%q代表单引?br /> str=%q!he\lo!<br /> <br /> Ҏ三:<br /> 使用%Q配合分界W,%Q代表双引?br /> str=%Q{he\lo}<br /> <br /> Ҏ四:<br /> here document构徏字符Ԍ该方法比较适合用于多行字符串的创徏。由<<和边界字W串作ؓ开_p界字W串作ؓl尾Q比如下列代码:<br /> str = <<END_OF_STRING1<br />   We are here now,<br />   where are you?<br /> END_OF_STRING1<br /> puts str<br /> 输出l果为:<br />   We are here now,<br />   where are you?<br /> <br /> 较ؓ复杂的是允许多个边界字符串对出现?br /> str = <<END_OF_STRING1,<<END_OF_STRING2<br />   We are here now,<br />   where are you?<br /> END_OF_STRING1<br />   I will leave now,<br />   would you like to go with me?<br /> END_OF_STRING2<br /> <br /> puts str<br /> 输出l果为:<br />   We are here now,<br />   where are you?<br />   I will leave now,<br />   would you like to go with me?</p> <h1>字面量与copy-on-write技?br /> </h1> <p> <br />     在Java中,如果两个String对象a和b的值都?abcdef",如下Q?br /> String a="abcdef";<br /> String b="abcdef";<br /> ? 么,JVM只会创徏一个常量对?abcdef",让a和b都指向它。但是在ruby中,采用了智能指针(熟悉c++的朋友清楚)的一个高U技? copy-on-writeQ一开始也是共享同一个字W常量,但是一旦之后某个对象(比如b对象)q行了修Ҏ作,?abcdef"生一个副本,b 的修Ҏ作在q个副本上进行?br />     更详l的讨论请参考http://developer.51cto.com/art/200811/98630.htm?/p> <h1>和Java的一些其他区?/h1> <p>     Java的String每次执行修改操作Q都不会改变自nQ而是创徏一个新的String对象Q而Ruby每次的修Ҏ作都会修改自w?/p> <h1>计算长度</h1> <p> puts "hello".length<br />     该句输出5Q是字符个数Q不要和C函数搞؜QC函数l常?l束字符Ԍ因此长度l常为实际字W个?1QRuby中没有这个习惯?/p> <h1>查找</h1> <h2>从左向右查找W一?/h2> <p>     indexҎ有三U重载,分别是:<br /> <a target="Code" class="method-signature"><span id="wmqeeuq" class="method-name">str.index(substring [, offset]) => fixnum or nil<br /> str.index(fixnum [, offset]) => fixnum or nil<br /> str.index(regexp [, offset]) => fixnum or nil</span> </a> <br />     W二个参数offset是可选参敎ͼ不用的话则从索引0的字W开始查找?br /> puts "hello".index("el") 输出? Q注意这里的'el'也可以。也可以只查一个字W比Q如puts "hello".index(101) 输出?Q这时候第一个参Cؓ'e'的二q制码?br /> 也可以用正则表辑ּq行查找Q比如puts "hello".index(/[az]/) 输出为nilQ因?hello"不包含a或者z。[]是正则表辑ּ的运符Q代表里面的a和z有一个找到即可?br /> puts "hello".index(/lo/) q个没有[]W号Q因此是查找子字W串loQ结果ؓ3.<br />     我个得尽量熟l用正则表辑ּ查找是最好的选择Q既可以完成单查找,也可以完成难度查找。不q需要付Z努力去学习?br />     下面q个例子puts "hello".index('o', -1) 证明了第二个参数可以敎ͼ虽然q没有什么意义,因ؓ功能和ؓ0{h?br />     如果查找不到Q返回nil?/p> <h2>逆向查找Q从左向x找最后一个还是从叛_左查扄一个) <br /> </h2> <p> <a target="Code" class="method-signature"><span id="wmqeeuq" class="method-name">str.rindex(substring [, fixnum]) => fixnum or nil<br /> str.rindex(fixnum [, fixnum]) => fixnum or nil<br /> str.rindex(regexp [, fixnum]) => fixnum or nil</span> </a>     <br />     W一个参数和index相同Q第二个参数是可选,如果不用则默认ؓ字符串尾部。如果ؓ0呢?则从W一个字W开始向x找。如果ؓ负数呢?q时候很奇怪,? 然能查到。通过看C的实C码,发现当fixnum<0Ӟ会执行这个运:fixnum+=substring.lengthQ然后就能找到。? 辑上可以理解为当fixnum<0Ӟ从最双开始向左移动abs(fixnum)-1个位|,q作为最后查找范_然后开始从左至双行查找? 字符串最双的字W的位置?1代表?br /> 下面两行代码l果都是nil:<br /> puts "hlloe".rindex('e', -2)<br /> puts "hlloe".rindex('e', 3)<br /> <br /> 下面两行代码l果都是1Q?br /> puts "hello".rindex('e', -2)<br /> puts "hello".rindex('e', 3)<br /> <br />     注意Q以上的代码理解是我个h观察代码后的猜测Q因为我q不会调试运行ruby的C代码Q所以不一定正。代码摘录如下:Q代码是ruby|站公布的C? 码,但是我所用的q_其实NetBeans6.7.1Q因此真正代码应该是Java实现的JRuby1.2.0Q这里的C代码仅供参考)<br /> static VALUE<br /> rb_str_rindex_m(argc, argv, str)<br />     int argc;<br />     VALUE *argv;<br />     VALUE str;<br /> {<br />     VALUE sub;<br />     VALUE position;<br />     long pos;<br /> <br />     if (rb_scan_args(argc, argv, "11", ⊂, &position) == 2) {<br />         pos = NUM2LONG(position);<br />         if (pos < 0) {<br />             pos += RSTRING(str)->len;<br />             if (pos < 0) {<br />                 if (TYPE(sub) == T_REGEXP) {<br />                     rb_backref_set(Qnil);<br />                 }<br />                 return Qnil;<br />             }<br />         }<br />         if (pos > RSTRING(str)->len) pos = RSTRING(str)->len;<br />     }<br />     else {<br />         pos = RSTRING(str)->len;<br />     }<br /> <br />     switch (TYPE(sub)) {<br />       case T_REGEXP:<br />         if (RREGEXP(sub)->len) {<br />             pos = rb_reg_adjust_startpos(sub, str, pos, 1);<br />             pos = rb_reg_search(sub, str, pos, 1);<br />         }<br />         if (pos >= 0) return LONG2NUM(pos);<br />         break;<br /> <br />       case T_STRING:<br />         pos = rb_str_rindex(str, sub, pos);<br />         if (pos >= 0) return LONG2NUM(pos);<br />         break;<br /> <br />       case T_FIXNUM:<br />       {<br />           int c = FIX2INT(sub);<br />           unsigned char *p = (unsigned char*)RSTRING(str)->ptr + pos;<br />           unsigned char *pbeg = (unsigned char*)RSTRING(str)->ptr;<br /> <br />           if (pos == RSTRING(str)->len) {<br />               if (pos == 0) return Qnil;<br />               --p;<br />           }<br />           while (pbeg <= p) {<br />               if (*p == c) return LONG2NUM((char*)p - RSTRING(str)->ptr);<br />               p--;<br />           }<br />           return Qnil;<br />       }<br /> <br /> <br /> <br /> 通常我们理解Z双开始查找,但是注释却表明是从左向右查找Qƈq回最后一个找到的目标的位|。究竟内q如何,只能看代码?br /> <span style="font-family: Courier New;">01161 <span id="wmqeeuq" class="keyword">static</span> <span id="wmqeeuq" 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&file=anchor.gif);" name="l01162"></a> <a class="code">01162</a> <a class="code">rb_str_rindex</a> (str, sub, pos)<br /> 01163 <a class="code">VALUE</a> str, sub;<br /> 01164 <span id="wmqeeuq" class="keywordtype">long</span> pos;<br /> 01165 {<br /> 01166 <span id="wmqeeuq" class="keywordtype">long</span> len = <a class="code">RSTRING</a> (sub)->len;<br /> 01167 <span id="wmqeeuq" class="keywordtype">char</span> *s, *sbeg, *t;<br /> 01168 <br /> 01169 <span id="wmqeeuq" class="comment">/* substring longer than string */</span> <br /> 01170 <span id="wmqeeuq" class="keywordflow">if</span> (<a class="code">RSTRING</a> (str)->len < len) <span id="wmqeeuq" class="keywordflow">return</span> -1;<br /> 01171 <span id="wmqeeuq" class="keywordflow">if</span> (<a class="code">RSTRING</a> (str)->len - pos < len) {<br /> 01172 pos = <a class="code">RSTRING</a> (str)->len - len;<br /> 01173 }<br /> 01174 sbeg = <a class="code">RSTRING</a> (str)->ptr;<br /> 01175 s = <a class="code">RSTRING</a> (str)->ptr + pos;<br /> 01176 t = <a class="code">RSTRING</a> (sub)->ptr;<br /> 01177 <span id="wmqeeuq" class="keywordflow">if</span> (len) {<br /> 01178 <span id="wmqeeuq" class="keywordflow" style="color: #ff0000;">while</span> <span style="color: #ff0000;"> (sbeg <= s) {</span> <br style="color: #ff0000;" /> <span style="color: #ff0000;">01179 </span> <span id="wmqeeuq" class="keywordflow" style="color: #ff0000;">if</span> <span style="color: #ff0000;"> (</span> <a style="color: #ff0000;" 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 id="wmqeeuq" class="keywordflow" style="color: #ff0000;">return</span> <span style="color: #ff0000;"> s - </span> <a style="color: #ff0000;" class="code">RSTRING</a> <span style="color: #ff0000;">(str)->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 id="wmqeeuq" class="keywordflow">return</span> -1;<br /> 01185 }<br /> 01186 <span id="wmqeeuq" class="keywordflow">else</span> {<br /> 01187 <span id="wmqeeuq" class="keywordflow">return</span> pos;<br /> 01188 }<br /> 01189 }<br /> <br />     通过看代码,发现s--;因此Q是从右向左q行匚wQ找到的W一个就q回。写注释的h应该枪毙!虽然看上L思一P但是法的时间复杂度大不一栗从左到右的查找LO(n),而从叛_左的最坏事件复杂度才是O(n)?br /> </span> </p> <h2>大小写不区分查找</h2> <p>     puts "hello".upcase.index("H")Q利用downcase或者upcase全部转换成小写或者大写,然后再查找?/p> <h2>正则表达式匹配查?/h2> <p> operator =~ 返回匹配的模式开始位|,如果没有扑ֈ则返回nil?br /> puts "abcde789" =~ /d/<br /> 输出5.</p> <h1>提取子字W串</h1> <p> str="hello"<br /> puts str[0,2]<br /> W一个参数是子字W串首字母的IndexQ第二个是长度(不能敎ͼ?br /> l果为he?br /> W一个参数可以ؓ负数Q会把最双的字W作?1Q然后向左增?1的方式查找v始位|,比如Q?br /> str="hello"<br /> puts str[-2,2]<br /> 输出为loQ这U情冉|们在rindexҎ中已l看到过了?br /> <br /> 也可以用正则表辑ּq行提取Q这真的很强大?br /> str="hello"<br /> puts str[/h..l/]<br /> 输出为hell?br /> <br /> W号.代表一个字W,两个.代表两个字符。两?里面的内容就是正则表辑ּ?*代表可以有无C字符Q比?br /> str="hello"<br /> puts str[/h.*o/]<br /> 输出为hello?/p> <h1>字符计数</h1> <p> String#count用来计算我们参数中给出的字符集中字符出现的L敎ͼ比如最单的情况Q?br /> str = "hello,world"<br /> puts str.count "w"<br />  “w" 参数代表的是一个字W结合,里面只有一个字WwQcountҎ计算出w出现?hello,world"的次数是1Q因此输Zؓ1?br /> 下面我们的参数里面包含了三个字符Q?br /> str = "hello,world"<br /> puts str.count "wld"<br /> 输出?Qw出现1ơ,l出现3ơ,d出现1ơ,正好5ơ?br /> <br /> 也可以传递多个参敎ͼ每个参数代表一个字W集合,q时候这些字W集合的交集作ؓcount计算的条Ӟ<br /> str = "hello,world"<br /> puts str.count "lo","o"<br /> 输出??br /> str = "hello,world"<br /> puts str.count "lo","o"," "<br /> 输出?Q因Z个集合的交集为空Q所以计结果ؓ0.<br /> <br /> 注意Q如果参数^o,代表o出现的次C计算?/p> <h1>删除末尾分隔W?/h1> <p> String#chompҎ有一个字W串参数Q指定了要在末尾删除的子字符丌Ӏ如果不用这个参敎ͼ则会字W串末尾的n,r和rn删除Q如果有的话Q?/p> <h1>压羃重复字符</h1> <p> String#squeezeҎ如果不用参数Q则会将字符串中的Q何连l重复字W变成单一字符Q如下:<br /> str = "helllloo"<br /> puts str.squeeze<br /> 输出Qhelo?br /> 如果传递字W串参数Q含义同countҎ的参CP代表了一个字W集合,则将W合条gQ?Q在字符集合中出玎ͼ2Q在字符串中q箋出现Q的子字W串压羃成的单一字符<br /> 实例代码如下Q?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 />     参数也可以用a-z方式表示在某个字W集合区间内?br /> <br /> 一个很常用的功能是利用squeeze(" ")对字W串内重复的I白字符q行压羃?/p> <h1>字符串删?/h1> <h2>deleteҎ</h2> <p> 可以接收多个参数Q每个参C表一个字W集合,cMcountҎ。如果有多个参数Q取交集Q然后从字符串中删除所有出现在交集中的字符?br /> <span style="font-family: Courier New;">"hello".delete "l","lo" #=> "heo"<br /> "hello".delete "lo" #=> "he"<br /> "hello".delete "aeiou", "^e" #=> "hell"<br /> "hello".delete "ej-m" #=> "ho"<br /> </span> </p> <h2>利用sub和gsub</h2> <p> 参见后面的sub用法Q?'q行替换卛_?br /> </p> <h1>字符串拆?/h1> <p> String#split接收两个参数Q第一个参数L被作为间隔符来拆分字W串Qƈ且不会出现在l果中?br /> W一个参数如果是正则表达式的话,如果为空Q则每个字符都被拆开Q返回一个字W数l。例子代码如下:<br /> str = "hello"<br /> puts str.split(//)<br /> 输出为:<br /> h<br /> e<br /> l<br /> l<br /> o<br /> <br />     如果正则表达式不为空Q则Ҏ匚w的情况进行拆分。例子代码如下:<br /> str = "hello"<br /> puts str.split(/h/)<br /> l果为:<br /> <br /> ello<br /> <br /> 拆分成了两个数组Q第一个ؓ""Q第二个为elloQ用hq行拆分的?br /> W一个参数的另一U用法很单,只是一个字W串Q用于作为间隔符q行拆分Q就不D例子了。我更們֐于用强大的正则表达式?br /> <br /> W二个参数是一个整敎ͼ用于Ҏ分的l果数组的元素个数进行限Ӟq个功能有多大用处,我现在到没有体会Q一般情况下不用卛_?/p> <h1>大小写{?/h1> <p>     如前面出现的Q利用downcase或者upcaseҎ卛_?/p> <h1>数组操作</h1> <p> 使用[]Q里面填上IndexQ就可以获取WIndex个元素?/p> <h1>和数值类型的怺转换</h1> <p> <br /> 获取单字节字W的二进制码<br /> puts ?e<br /> Q运符用于中文是非法的?/p> <h1>字符串P?/h1> <p> Rubyq代器的设计不在q里讨论Q我会专门有一文章描q?/p> <h2>each_char</h2> <p> q代每个字符Q下面是CZ代码Q?br /> require 'jcode' #NetBeans6.7.1和JRuby1.2.0需要,否则下面代码找不到方?br /> "hello".each_char(){ |c| print c,' ' } #()可以不写<br /> <br /> |c| 代表字符串中的当前字W?/p> <h2>each</h2> <p> q代每个子字W串Q如果不传递seperator参数Q则默认用n作ؓseperator?br /> "hellonworld".each { |c| puts c }<br /> 输出为:<br /> hello<br /> world<br /> <br /> 如果传递了有效的字W串作ؓseperator参数Q那么就以这个seperator代替nq行子字W串的P代:<br /> "hellonworld".each('l') { |s| p s }<br /> 输出为:<br /> "hel"<br /> "l"<br /> "onworl"<br /> "d"</p> <h2>each_byte</h2> <p> 用法和each_charcMQ不qP代的对象是charQ因此输出的是二q制数倹{?br /> "hellonworld".each_byte { |s| print s," " }<br /> 输出Q?br /> 104 101 108 108 111 10 119 111 114 108 100</p> <h2>each_line</h2> <p> 用法和前面相同,只是用换行符分割子字W串q行q代Q?br /> "hellonworld".each_line do |s|<br />   print s<br /> end<br />     注意Q这是另一U写法,用do/end替换了{/}寏V?br /> 输出为:<br /> hello<br /> world<br /> 只所以输Zؓ两行Q是因ؓW一个子字符串是"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 <<操作</h2> <p> str1="hello,"<br /> str2="world"<br /> str1<<br /> puts str1<br /> 输出为hello,world</p> <h2>concatҎ</h2> <p> concatҎ可以在字W串后面加上一个二q制gؓ[0,255]的字W,用法如下Q?br /> str1="hello,world"<br /> str1.concat(33)#33?的二q制?br /> puts str1<br /> 输出为hello,world!<br /> <br /> concat也可以接一个objectQ比如另一个String对象</p> <h1>是否为空</h1> <p> String#empty? Ҏ 如果为空q回trueQ否则返回false</p> <h1>字符串比?/h1> <h2>operator<=>操作</h2> <p> str1<=>str2<br /> 如果str1于str2Q返?1Q?br /> 如果str1{于str2Q返?Q?br /> 如果str1大于str2Q返??br /> <br /> 官方注释写反了?/p> <h2>operator==操作</h2> <p> 两个比较对象必须都ؓStringQ否则返回false;<br /> 如果都是String对象Q则调用operator <=> 操作W进行比较,比较l果?Ӟq回trueQ否则返回false<br /> </p> <h1>字符串替?/h1> <h2>replaceҎ</h2> <p> 和operator = 功能相同Q字W串内容的完全替换,没什么作用?br /> <br /> </p> <h2>subҎ</h2> <p> <a target="Code" class="method-signature"><span id="wmqeeuq" class="method-name">str.sub(pattern, replacement) => new_str<br /> str.sub(pattern) {|match| block } => new_str</span> </a> <br /> <br /> 在str副本上将扑ֈ的第一个匹配字W(Ԍ用replacement替换Qƈq回。比如:<br /> puts "abcde789".sub(/d/, "000")<br /> 输出为:abcde00089<br /> <br /> W二U重载Ş式允许执行一D代码,比如Q?br /> puts "abcde789".sub(/d/){|c| 'a'}<br /> 扑ֈ的字W用|c|表示Q可以替换成a字符<br /> 输出为:abcdea89</p> <h2>gsubҎ</h2> 和sub的区别在于所有匹配的地方都会被替换,而不只是W一个?br /> <img src ="http://www.aygfsteel.com/nkjava/aggbug/308088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nkjava/" target="_blank">草原上的骆驼</a> 2010-01-03 16:22 <a href="http://www.aygfsteel.com/nkjava/archive/2010/01/03/308088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ѽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">С</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">᰸</a>| <a href="http://" target="_blank">Т</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank">ǰ</a>| <a href="http://" target="_blank">ٲ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">绯</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ʡ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>