Nice trick ! However, in D, you have scope(exit) scope(success) and scope(failure) to do similar stuffs.

I personally use both, on a case by case basis.

Le 17/10/2011 06:47, Steve Teale 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);
}

Reply via email to