Phrogz wrote: > What makes the final separator so special that it deserves inclusion, > while making no allowance for a pre-separator? Just the English > language? Well, just for poops and giggles, here's a less racist alternative (JEG-compatible): require "enumerator" class Array alias old_join join def join(sep = $,, last_sep = nil, &each_prefix) each_prefix ||= proc do |e,i| (last_sep if i == length - 1) || sep end enum_with_index.map do |e,i| i == 0 ? e : "#{each_prefix[e,i]}#{e}" end.old_join 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 def test_new_block_behavior assert_equal '1 dna, 2, 3, 4, 5', (1..5).to_a.join {|e,i| i == 1 ? ' dna, ' : ', ' } end end end