非会员范围功能

时间:2010-10-05 23:25:30

标签: d

我有一个我正在实现范围的课程。我想以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)。

我做错了什么?

2 个答案:

答案 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在所有情况下所做的事情,除了数组之外,显然不能将它们作为其类型的一部分,并且必须使用它们的能力来调用它们的函数,就好像它们是成员函数一样才能工作。