I was wondering about the semantics of Kernel#chomp and
Kernel#chop. Take 'chomp'

     static VALUE
     rb_f_chomp(argc, argv)
         int argc;
         VALUE *argv;
     {
         VALUE str = rb_str_dup(uscore_get());
         if (!NIL_P(rb_str_chomp_bang(argc, argv, str))) {
             rb_lastline_set(str);
         }
         return str;
     }

If no change is make to $_, a new copy of it is returned. If a change
_is_ made, then it becomes the copy, which is returned.

This additional rb_str_dup looks like it's trying to avoid some kind
of aliasing problem. Is the extra copy necessary?


Regards


Dave