奇怪的行为与“这个T”
问题描述:
有人可以解释以下对我的行为?奇怪的行为与“这个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"]
到底为什么做它像这样?它看起来像一个错误,但也许这是行为的原因?
答
看看我看到的代码是因为构造函数被称为递归。
简单的解决方法是如下:
static if (member != "__ctor") mixin("members ~= to!string(child." ~ member ~ ");\r\n");