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