Hugh Sasse Staff Elec Eng <hgs / dmu.ac.uk> writes:

> On 12 Jun 2000, Dave Thomas wrote:
> 
> > 
> > How about making any assignment to one of these globals-with-a-
> > side-effect generate a warning if -w was in effect. That way you'd at
> > least know that it was happening.
> 
> Would it be possible to have a test for "when calling this code, it
> is possible to exit leaving a global variable changed"?.  There are
> only so many wasy to leave a method, module... without completely
> crashing.

Well, you _could_ implement Perl's 'local' facility for Ruby globals:


     def local(*syms)
       save = {}
       syms.each { |aSym| save[aSym] = (eval "#{aSym}") }
       begin
         yield
       ensure
         save.each { |aSym, aVal|  eval "#{aSym} = aVal" }
       end
     end

You'd call this with

     local (<list of globals to save>) {

         code that modifies them

     }

    <values restored here>

For example:

     $; = "hello"
     $/ = "goodbye"
     $, = ", "

     local(:$;, :$/, :$,) {
       $; = 'hi';
       $/ = nil
       $, = " - "
       print $;, $/, "\n"     #=> hi - nil - 
     }

     print $;, $/, "\n"       #=> hello, goodbye, 


This is pretty tacky code - the 'local' method should check that it is
only passed true globals, and should reject $_ and $!. That's left as
an exercise to the reader (as we say) ;-)


Dave