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"]
到底爲什麼做它像這樣?它看起來像一個錯誤,但也許這是行爲的原因?