2013-03-07 333 views
1

基本上它是Rails代碼,但這裏是純Ruby問題。 要知道 - @ test.source是一些String,它可以包含' '(空格)。其目的是刪除首先出現的所有不必要的空間。例如,%some word' '' '應該保留%some word' ',%another word' '' '' '應該離開%another word' '等等。無限'while'循環

for i in [email protected] 
     if @test.source[i] == ' ' 
      i=i+1 
      while @test.source[i] == ' ' 
       @test.source[0...i].chop 
      end 
     else 
      i+=1 
     end 
    end 

由於某種原因,此循環(obviosly'while')是無限的。爲什麼?

+0

通常多數民衆贊成用正則表達式完成的,例如:'@ test.source.gsub(/ \ s + /,'「)' – AJcodez 2013-03-07 03:12:30

+0

正則表達式似乎是強大的工具 – 2013-03-07 03:43:22

+0

但也刪除所有換行符,如何修復? – 2013-03-07 04:03:16

回答

1

在while循環中,您不會增加i,所以while循環將始終將指定的字符與' '進行比較而不會繼續。

它改成這樣:

 <% while @test.source[i] == ' ' %> 
      <% @test.source[0...i].chop %> 
      <% i=i+1 %> 
     <% end %> 

......但即使是這樣,仍然有你的代碼的問題。這是一個讓讀者看到剩餘問題的練習。 :)

+0

謝謝。這樣可行。但我沒有得到,因爲我使用印章,不應該@ test.source [我]在新的循環是先前是@ test.source [i-1]? – 2013-03-07 03:18:20

+0

['String#chop'](http://www.ruby-doc.org/core-2.0/String.html#method-i-chop)不會修改原始字符串。如果你想這樣做,你需要使用['String#chop!'](http://www.ruby-doc.org/core-2.0/String.html#method-i-chop-21)。但即使如此,就像戴維說的那樣,有更好的(更習慣的)方法來實現你想要的。 – 2013-03-07 03:28:07