On Sun, 18 Feb 2001, Stephen White wrote:

>     str1 = rb_str_append(str1, str2);

Gawd, I'm thick. I overlooked this when it was jumping up and down and
kicking me in the nuts. Must have lost feeling down there from all the
other times I've been thick. :)

In abject apology, here's the right answer (I think!)...

Init_String has:
    rb_define_method(rb_cString, "<<", rb_str_concat, 1);

rb_str_concat(str1, str2) has:
    str1 = rb_str_append(str1, str2);

rb_str_append(str1, str2) has:
    if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2);

rb_str_to_str(str) has:
    return rb_convert_type(str, T_STRING, "String", "to_str");

Which explains why aliasing 'to_s' to 'to_str' enables the automatic
conversions.

One day I'll manage to make a posting here without 5 follow-up corrections.

-- 
  spwhite / chariot.net.au