From: James Edward Gray II Date: 2007-01-01T05:05:17+09:00 Subject: Mini-RCR: Extra Argument for Array#join I've been looking at the to_sentence() method in Rails. It's basically a join(), but you can give a different final separator. I personally use this kind of functionality often enough to believe it would make a good addition to the core language. Even better, I think we can make join() smart enough to eliminate any need for to_sentence() by adding a second argument. Here's a sample implementation: #!/usr/bin/env ruby -w require "enumerator" class Array alias_method :old_join, :join def join(sep = $,, last_sep = sep) return "" if empty? enum_with_index.inject("") do |str, (e, i)| "#{str}#{i == size - 1 ? last_sep : sep}#{e}" end[sep.to_s.length..-1] end end if __FILE__ == $PROGRAM_NAME require "test/unit" class TestJoin < Test::Unit::TestCase def test_old_matches_new assert_equal([].old_join, [].join) assert_equal([1].old_join, [1].join) assert_equal([1, 2].old_join, [1, 2].join) assert_equal((1..5).to_a.old_join, (1..5).to_a.join) assert_equal([].old_join("|"), [].join("|")) assert_equal([1].old_join("|"), [1].join("|")) assert_equal([1, 2].old_join("|"), [1, 2].join("|")) assert_equal((1..5).to_a.old_join("|"), (1..5).to_a.join("|")) end def test_new_last_arg_behavior assert_equal("1, 2, 3, 4, and 5", (1..5).to_a.join(", ", ", and ")) assert_equal("1, 2, 3, 4 and 5", (1..5).to_a.join(", ", " and ")) assert_equal("1, 2, 3, 4 & 5", (1..5).to_a.join(", ", " & ")) assert_equal([1, 2].join(","), [1, 2].join("ignored", ",")) end end end __END__ Does anyone else like this? James Edward Gray II