Chris Shea wrote:
> On Jul 19, 8:59 pm, "Michael W. Ryder" <_mwry... / worldnet.att.net>
> wrote:
>> I was trying to come up with a way to remove x instances of a character
>> from a string and came up with a problem.  If I enter:
>>
>> a = "a b c d e f"
>> for i in 1..3
>>    a = a.sub!(' ', '')
>> end
>> puts a  ==> returns 'abcd e f' which is correct.
>>
>> But if I enter:
>>
>> a = "a b c d e f"
>> for i in 1..10
>>    a = a.sub!(' ', '')
>> end
>> puts a  ==> returns error.rb:3: private method `sub!' called for
>> nil:NilClass (NoMethodError, and a is now nil.
>>
>> What I am looking for is a way to remove the first n instances of a
>> blank from the string without wiping out the string if it does not
>> contain at least n blanks.  I assume there is a way to do this with
>> regular expressions, but have not found it yet.  This is something an
>> editor I liked, UCEDIT, on the CDC Cyber had in the 70's.
> 
> sub! modifies the string in place, so you don't need to say a = a.sub!
> (' ','').  a is already changing.  And since sub! is modifying in
> place, it returns nil if no changes are being made, and you end up
> setting a to nil when that happens.
> 
> a = 'a b c d e f'
> 10.times { a.sub!(' ','')}
> puts a     # 'abcdef'
> 
> HTH,
> Chris
> 

I think this is where I am having problems understanding Ruby.  I have 
to use a.sub(' ', '') in a for loop but use a.sub!(' ', '') when using a 
times loop.  Why the difference?