scope struct?

Christophe travert at phare.normalesup.org
Sun Oct 23 02:24:20 PDT 2011


Steve Teale , dans le message (digitalmars.D.learn:30117), a écrit :
> Is not needed because structs are inherently scope.
> 
> I'm sure experienced D programmers do this all the time when they want 
> something done on exit from a scope, but I never had, and maybe there are 
> others who haven't, particularly if coming from a C++ 'use classes for 
> everything' background.
> 
> import std.stdio;
> 
> bool glob;
> 
> struct Sentinel
> {
>    void function() doit;
>    bool already;
>    this(void function() f)
>    {
>       doit = f;
>       already = false;
>    }
> 
>    ~this()
>    {
>       if (!already)
>       {
>          writeln("Doing it now");
>          doit();
>       }
>       else
>          writeln("Won't bother");
>    }
> 
>    void dontBother() { already = true; }
> }
> 
> void reset() { glob = false; }
> 
> void main(string[] args)
> {
>    glob = true;
>    {
>       Sentinel s = Sentinel(&reset);
>       writeln("Doing stuff in the scope");
>       if (args.length >= 2 && args[1] == "db")
>          s.dontBother();
>    }
>    writeln(glob);
> }



void main(string[] args)
{
  glob = true;
  {
    dontBother=false;
    scope(exit)
    {
      if (!dontBother)
        {
          writeln("Doing it now");
          glob = false;
        }
      else
	{
          writeln("Don't bother");
        }
     }

     writeln("Doing stuff in the scope");
     if (args.length >= 2 && args[1] == "db")
       dontBother() = true;
  }
  writeln(glob);
}


If you're not running a test with a lot of writing, the scope clause is 
just:

scope(exit) if (!dontBother) glob() = false;

The scope exit clause will be run even if you exit via an exception 
(just like the sentinel's dstructor).

As you can see, D as its own syntax to make things when the scope exits, 
so you don't need to build a sentinel struct.
http://d-programming-language.org/exception-safe.html


More information about the Digitalmars-d-learn mailing list