2017-10-19 136 views
1

有人可以解釋以下對我的行爲?奇怪的行爲與「這個T」

與基類是這樣的:

abstract class Foo 
{ 
    string[] members; 

    final: 

    this(this T)(T child) 
    { 
     import std.conv : to; 

     foreach (member; __traits(derivedMembers, T)) 
     { 
      mixin("members ~= to!string(child." ~ member ~ ");\r\n"); 
     } 
    } 

    void printMembers() 
    { 
     writeln(members); 
    } 
} 

我期望成員與傳遞的孩子類型的值來填充。

但是,這種行爲真的很奇怪。

數組成員將無限填充,這基本上會導致程序內存不足。

如果更改混入到這一點:

mixin("if (members.length < 20) members ~= to!string(child." ~ member ~ ");\r\n"); 

,那麼你就能夠看到該陣列的填充方式,但價值不的代碼應該如何工作方面是有意義的。

用法示例:

class Bar : Foo 
{ 
    int baba; 
    int caca; 

    this() { baba = 1; caca = 2; super(this); } 
} 

class Baz : Foo 
{ 
    int foo; 
    int bar; 
    int baz; 

    this() { foo = 100; bar = 200; baz = 300; super(this); } 
} 

void main() 
{ 
    auto b = new Bar(); 
    auto a = new Baz(); 

    b.printMembers(); 
    a.printMembers(); 
    b.printMembers(); 
} 

上面的代碼將產生一個輸出象下面這樣:

["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar"] 
["100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz"] 
["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar"] 

在哪裏我本來期望是這樣的:

["1", "2"] 
["100", "200", "300"] 
["1", "2"] 

到底爲什麼做它像這樣?它看起來像一個錯誤,但也許這是行爲的原因?

回答

1

看看我看到的代碼是因爲構造函數被稱爲遞歸。

簡單的解決方法是如下:

static if (member != "__ctor") mixin("members ~= to!string(child." ~ member ~ ");\r\n");