Bug #2957
closedIO.print emits field separator after each object, rather than between
Description
=begin
In versions prior to 1.9, IO.print emits the field separator "$," between each object printed when non-nil.
As of r11003, IO.print emits the field separator after each field. This change was reported by
Alex DeCaria in [ruby-talk:358633].
The following patch
(a) reverts the behavior to what it was in 1.8.X
(b) Documents the behavior of the field separator
(c) Adds a test case
Index: io.c¶
--- io.c	(revision 26905)
+++ io.c	(working copy)
@@ -5879,7 +5879,9 @@
- 
ios.print(obj, ...) => nil
- Writes the given object(s) to ios. The stream must be
- 
- opened for writing. If the output record separator ($\)
 
- opened for writing. If the output record separator (
- 
- opened for writing. If the output field separator ($,)
 
- opened for writing. If the output field separator (
- 
- is not nil, it will be inserted between each object.
 
- is not 
- 
- If the output record separator ($\)
- is not nil, it will be appended to the output. If no
- arguments are given, prints $_. Objects that aren't
- strings will be converted by calling their to_smethod.
 @@ -5906,10 +5908,10 @@
 argv = &line;
 }
 for (i=0; i<argc; i++) {
 
- If the output record separator (
- rb_io_write(out, argv[i]);
- if (!NIL_P(rb_output_fs)) {
- 
if (!NIL_P(rb_output_fs) && i>0) { 
 rb_io_write(out, rb_output_fs);
 }
- 
rb_io_write(out, argv[i]); 
 }
 if (argc > 0 && !NIL_P(rb_output_rs)) {
 rb_io_write(out, rb_output_rs);
 Index: test/ruby/test_io.rb
 ===================================================================
 --- test/ruby/test_io.rb (revision 26905)
 +++ test/ruby/test_io.rb (working copy)
 @@ -1386,6 +1386,23 @@
 assert_in_out_err(["-", t.path], "print while $<.gets", %w(foo bar baz), [])
 end
- 
def test_print_separators 
- 
$, = ':' 
- 
$\ = "\n" 
- 
r, w = IO.pipe 
- 
w.print('a') 
- 
w.print('a','b','c') 
- 
w.close 
- 
assert_equal("a\n", r.gets) 
- 
assert_equal("a:b:c\n", r.gets) 
- 
assert_nil r.gets 
- 
r.close 
- 
ensure 
- 
$, = nil 
- 
$\ = nil 
- 
end 
- 
def test_putc 
 pipe(proc do |w|
 w.putc "A"
 =end