我的 D 程序中有一些相当奇怪的行为,我已将其范围缩小到:
import std.algorithm;
import std.stdio;
import std.traits;
enum E { a, b, c };
struct S { E e; };
void main()
{
immutable(S)[] source = [ S(E.a), S(E.a), S(E.b) ];
foreach (e; EnumMembers!E)
{
size_t c = count!(x => x.e == e)(source);
writeln(e, " -> ", c);
}
}
我希望该程序的输出类似于以下内容:
a -> 2
b -> 1
c -> 0
但实际结果是:
a -> 2
b -> 2
c -> 2
奇怪的是,更改 for 循环以foreach (e; [ E.a, E.b, E.c ])
产生我预期的输出。使用foreach (e; [ EnumMembers!E ])
也产生了我的预期结果,所以很明显我对范围的使用EnumMemebers
是这里的问题......我只是不知道为什么。
我显然做错了什么,但我不知道是什么,并希望得到一些见解。
我的编译器DMD64 D Compiler v2.059
在 Linux 上。
编辑:这与 GDC 4.6.3 具有完全相同的行为,因此它不能是编译器错误。
编辑:通过将count
调用移至单独的函数:
size_t counte(Range)(E e, Range src)
{
return count!(x => x.e == e)(src);
}
并将c
的初始化更改为size_t c = counte(e, source);
,程序按我的预期工作。