From: Logan Capaldo Date: 2005-05-06T08:45:13+09:00 Subject: Re: String Manipulation Nuby Question "#{title} #{forename} #{surname}".strip On 5/5/05, Chris Roos wrote: > I have a Person with title, forename and surname (all of which are > optional). I want to return a 'pretty' name for this person in the format.. > > title + + forename + + surname > > ..where any extraneous spaces are removed. > > My name method currently looks like this > > def name > ( > (title.to_s.strip.empty? ? "" : title.to_s.strip << " ") << > (forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") << > (surname.to_s.strip.empty? ? "" : surname.to_s.strip) > ).strip > end > > I created seven tests for this method for each combination of the three > parameters. All seven tests pass with this implementation. > > Note. I was half way through writing about how I should probably test > for nil and maybe return an empty string from the three (title, > forename, surname) methods when I realised that all I was really doing > was testing for nil in a roundabout way; i.e. convert possible nil's to > string then strip spaces then check for empty... > > I started thinking about this some more and realised that a test for nil > would return false which would allow me to re-write the above method > like so.. > > def name > ( > (title ? title.strip << " " : "") << > (forename ? forename.strip << " " : "") << > (surname ? surname.strip : "") > ).strip > end > > This gets rid of the nasty duplication and double question marks in the > first method. > > I also realised that I needed another test - for all nil's. They all > still passed. > > What I was originally going to ask was how to improve on the first > implementation above. Even though (in my opinion) the second > implementation is a lot cleaner I'm still interested in whether it can > be made even more succinct as in 'the ruby way'? > > It may be a very small method and have taken me about an hour to go > through this process but I'm quite pleased as to how it's turned out. > > Chris > >