> Normally the rule is that the method modifies the current instance as
> opposed to the creation of a new instance (e.g. String#gsub! and
> String#gsub).  But that convention is not followed consistently in the std
> lib.   I guess the explanatory text contains "historic reasons" somewhere.
> :-}

More accurately,  ! just means "be careful" -- exit! (no cleanup),
sub! (modifies receiver) ... that sort of thing.