On Sat, Aug 24, 2013 at 11:30:26PM -0700, Walter Bright wrote:
[...]
> Your example, again, is of an auto-generated dtor. But you said
> earlier that wasn't the point.
> 
> Without the auto-generated dtor, it is just scope(failure), which is
> already a D feature.
> 
> I don't get it.

It's a way to avoid code duplication in the dtor. If you just had
scope(failure), you have to factor out a __cleanup method in order to do
cleanup on both a failed ctor call or a dtor call, as I did in the
example.

I don't know if it will clarify things, but if you already have a dtor,
then scope(this) just adds to it:

        class C {
                this() {
                        scope(this) writeln("A");
                        scope(this) writeln("B");
                }
                ~this() {
                        writeln("In dtor");
                }
        }

This would get lowered to the equivalent of:

        class C {
                this() {
                        scope(failure) __cleanup();
                        __cleanups ~= { writeln("A"); };
                        __cleanups ~= { writeln("B"); };
                }

                void delegate()[] __cleanups;

                void __cleanup() {
                        foreach_reverse (f; __cleanups)
                                f();
                }

                ~this() {
                        writeln("In dtor");
                        __cleanup();
                }
        }


T

-- 
Skill without imagination is craftsmanship and gives us many useful
objects such as wickerwork picnic baskets.  Imagination without skill
gives us modern art. -- Tom Stoppard

Reply via email to