我有一个我正在实现范围的课程。我想以phobos库的方式实现这些功能,即在主类之外。
void popBack(T)(ref T[] a) if (!is(Unqual!T == char) && !is(Unqual!T == wchar))
{
assert(a.length);
a = a[0 .. $ - 1];
}
这是我的版本:
void popFront(T)(ref PersistentList!(T) a)
{
a = a.next();
}
当我尝试使用forech编译此代码时,我得到:
Error 1 Error: no property 'popFront' for type 'stmd.PersistentList!(int).PersistentList' main.d
我可以将成员代码移动到主类中,但由于我正在修改输入“ref”值,我不能使用popFront()我真的需要popFront(ref a)。
我做错了什么?
答案 0 :(得分:4)
您尝试做的事情取决于D社区调用统一函数调用语法。这是使用与成员函数相同的语法调用非成员函数的能力。这已经在阵列中实施了很长时间,并且有一些关于采取它的程度的争论。已经决定应该为所有类型实现它,但是Walter Bright,编译器实现者还没有开始这样做,因为他一直在64位支持上狂热地工作。
统一函数调用语法在Andrei Alexandrescu的书“The D Programming Language”中有所描述,该书被认为是D2的权威指南。它目前缺乏实施被认为是一个错误。这应该在几个版本中修复。
答案 1 :(得分:3)
Phobos仅在数组的struct / class之外实现范围函数。数组允许您调用它们上的函数,就像它们是成员函数一样。所以,如果你有这个功能:
int func(int[] arr)
{
return arr[0];
}
你可以这样称呼它
auto arr = [1, 2, 3];
auto val = arr.func();
而不是
auto val = func(arr);
能够对所有类型执行此操作称为通用函数调用语法,但这在D中目前不合法,但看起来它可能会被添加。
没有理由在范围类型之外声明范围函数,除非您希望与其他范围类型共享该实现,这通常是不可能的,因为内部实现必须处理如何容器类型维护其数据。所以,您也可以将它们作为范围类型的一部分。这就是Phobos在所有情况下所做的事情,除了数组之外,显然不能将它们作为其类型的一部分,并且必须使用它们的能力来调用它们的函数,就好像它们是成员函数一样才能工作。