Static constructors inconsistency
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Apr 26 19:06:14 PDT 2014
On 04/26/2014 12:10 PM, spec wrote:
> Hello, i'am experiencing some non consistent behavior with static
> constructors. I wonder if this is some bug or i just don't know enough
> of D (most probably!).. Code example bellow:
>
> //------------------------------------------
> module main;
>
> import std.stdio;
>
> class B
> {
> static this()
> {
> A a = new A;
> int val = a.getValue("A");
> }
> }
>
> class A {
> private static int[string] aa;
>
> static this()
> {
> aa = ["A":1, "B":2];
> writeln("@ A static ctor!");
> }
>
> int getValue(string str)
> {
> return aa[str];
> }
> }
>
>
>
> void main(string[] args)
> {
> B B = new B;
> }
> //------------------------------------------
>
> The text "@ A static ctor!" never gets printed. The inconsistency (IMHO)
> is that if i do any of this:
> - Declare class A before B;
> - Change the var declared in A from an AA to some other p.e int;
> - Comment the line "int val = a.getValue("A")";
>
> Maybe there are some other points, but at this point i got confused and
> decided trying to understand it. Anyway with any of those changes the
> text gets printed.
>
> Anyone able to shed some light into this?
>
> Cheers,
I don't know whether the inconsistency is a bug but according to
documentation, static this inside a module are executed in lexical
order: "Static constructors within a module are executed in the lexical
order in which they appear."
http://dlang.org/class.html#StaticConstructor
So, if B depends on A then A's static this must appear before B's.
Ali
More information about the Digitalmars-d-learn
mailing list