From: Robert Klemme Date: 2009-12-10T23:36:31+09:00 Subject: Re: human-readable listing of array elements 2009/12/10 Aldric Giacomoni : > This took me less than a minute to write, but I don't know if it's as > elegant as it could be. Are there more "Ruby-like ways(tm)" to write > this? > > def stringify array >  return array[0] if array.size == 1 >  string = "" >  array.each_with_index do |element, index| >    case index >      when array.size - 1 # last item >        string += " and #{element}" >      when 0 >        string += "#{element}" >      else >        string += ", #{element}" >    end >  end >  string > end By using String#<< your code will become more efficient because you do not create new String objects all the time. For the fun of it here are two other solutions: irb(main):026:0> def stringify array irb(main):027:1> lead = array.slice 0...-1 irb(main):028:1> lead.empty? ? array.last.to_s : [lead.join(", "), array.last].join(" and ") irb(main):029:1> end => nil irb(main):031:0> stringify [] => "" irb(main):032:0> stringify %w{foo} => "foo" irb(main):033:0> stringify %w{foo bar} => "foo and bar" irb(main):034:0> stringify %w{foo bar baz} => "foo, bar and baz" irb(main):039:0> def stringify array irb(main):040:1> tail = array.slice -2..-1 irb(main):041:1> tail ? (array.slice(0...-2) << tail.join(" and ")).join(", ") : array.first.to_s irb(main):042:1> end irb(main):048:0> stringify [] => "" irb(main):045:0> stringify %w{foo} => "foo" irb(main):046:0> stringify %w{foo bar} => "foo and bar" irb(main):047:0> stringify %w{foo bar baz} => "foo, bar and baz" Note, I don't claim that this is necessarily more rubyish. :-) Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/