代码之家  ›  专栏  ›  技术社区  ›  Timothy Baldridge

非成员范围函数

d
  •  5
  • Timothy Baldridge  · 技术社区  · 14 年前

    我有一个类,我正在为它实现范围。我希望像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();   
    }
    

    Error   1   Error: no property 'popFront' for type 'stmd.PersistentList!(int).PersistentList'   main.d  
    

    我做错什么了?

    2 回复  |  直到 14 年前
        1
  •  4
  •   dsimcha    14 年前

    您要做的事情取决于D社区所称的统一函数调用语法。这是使用与成员函数相同的语法调用非成员函数的能力。这种方法只在阵列上实现了很长时间,对于它要走多远还存在一些争论。已经决定应该为所有类型实现它,但是编译器实现者walterbright还没有抽出时间来做这件事,因为他一直在狂热地研究64位支持。

    统一函数调用语法在Andrei Alexandrescu的书中有描述,“ The D Programming Language

        2
  •  3
  •   Jonathan M Davis    14 年前

    Phobos只在数组的结构/类之外实现范围函数。数组允许您调用它们上的函数,就像它们是成员函数一样。所以,如果你有这个功能:

    int func(int[] arr)
    {
        return arr[0];
    }
    

    auto arr = [1, 2, 3];
    auto val = arr.func();
    

    而不是

    auto val = func(arr);
    

    对所有类型都能做到这一点被称为通用函数调用语法,但这在D中目前并不合法,尽管看起来可能会添加它。