Mixin mystic
Georg Wrede
georg.wrede at iki.fi
Sat Apr 4 11:52:37 PDT 2009
On December 14, Nick Sabalausky wrote:
> That explains a certain mystery I encountered in a library I wrote.
> Everything *seemed* like it should have worked with "scope" instead
> of "auto" but it never did. The variables that were mysteriously
> unconvertable to "scope" were declared in a mixin.
>
> This makes me wonder though: should mixins be implicitly creating a
> new scope at all? Clearly there are cases where it's desireable to not
> have that implicit scope, and with the current behavior I don't see a
> workaround. Are there cases where an implicit new scope would be
> desired? If so, could those cases be sufficiently worked around by
> explicitly creating a new scope in the mixin?
For some reason, nobody seemed to have read this question.
One would think that the mixin not creating a new scope would be what
the programmer expects. Or at least hopes...
On a related note, seems an object of a scope variable in a mixin
doesn't get destructed. Is this a result of some hack, or intended behavior?
Below, instance "scope_mixi_a" never gets destructed.
======================================================
import std.stdio;
class Ob
{
string myname;
this(string s)
{
myname = s;
// writeln("Ob ", myname, " created.");
}
~this() {writeln("Ob ", myname, " destructed.");}
}
template mixi()
{
scope mixi_a = new Ob("scope_mixi_a");
auto mixi_b = new Ob("auto_mixi_b");
}
void main()
{
scope x = new Ob("scope_x");
auto y = new Ob("auto_y");
{
scope a = new Ob("scope_a");
auto b = new Ob("auto_b");
mixin mixi;
scope c = new Ob("scope_c");
auto d = new Ob("auto_d");
writeln(" -- last line of inner scope");
}
scope z = new Ob("scope_z");
auto u = new Ob("auto_u");
writeln(" -- last line of outer scope");
}
======================================================
Output:
-- last line of inner scope
Ob scope_c destructed.
Ob scope_a destructed.
-- last line of outer scope
Ob scope_z destructed.
Ob scope_x destructed.
Ob auto_u destructed.
Ob auto_d destructed.
Ob auto_mixi_b destructed.
Ob auto_b destructed.
Ob auto_y destructed.
More information about the Digitalmars-d
mailing list