2013-03-07 336 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