views:

291

answers:

3

I'm new to Ruby, and have been working my way through Mr Neighborly's Humble Little Ruby Guide. There have been a few typos in the code examples along the way, but I've always managed to work out what's wrong and subsequently fix it - until now!

This is really basic, but I can't get the following example to work on Mac OS X (Snow Leopard):

gone = "Got gone fool!"
puts "Original: " + gone
gone.delete!("o", "r-v")
puts "deleted: " + gone

Output I'm expecting is:

Original: Got gone fool!
deleted: G gne fl!

Output I actually get is:

Original: Got gone fool!
deleted: Got gone fool!

The delete! method doesn't seem to have had any effect.

Can anyone shed any light on what's going wrong here? :-\

+1  A: 

You get same o/p using some different way like gsub

puts "deleted: " + gone.gsub('o', '')

o/p

deleted: Got gone fool!
Salil
Strange, isn't it? Are you on MAC OS X, too?
brianheys
+1  A: 

I changed

gone.delete!("o", "r-v")

to

gone.delete!("or-v")

and it works fine.

Sid H
Thanks a lot! I tried just about everything but that! Out of interest, are you on MAC OS X, too?
brianheys
Nope. I use ruby on windows and linux. Most of ruby should be OS agnostic and so any initial problems you face shouldn't be specific to OS X.
Sid H
+2  A: 

The String.delete method (Documented here) treats its arguments as arrays and then deletes characters based upon the intersection of its arrays.

The intersection of 2 arrays is all characters that are common to both arrays. So your original delete of gone.delete!("o", "r-v") would become

gone.delete ['o'] & ['r','s','t','u','v']

There are no characters present in both arrays so the deletion would get an empty array, hence no characters are deleted.

Steve Weet
Another typo chalked up to the examples in the book then. ;-)Thanks a lot for the explanation.
brianheys