"#{title} #{forename} #{surname}".strip

On 5/5/05, Chris Roos <chris / seagul.co.uk> 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 + <space> + forename + <space> + 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
> 
>