代码之家  ›  专栏  ›  技术社区  ›  Straivers

类的Dlang泛型

  •  2
  • Straivers  · 技术社区  · 11 年前

    第一次海报。我已经使用Java几年了,并决定学习D。在Java中,您可以用泛型类型声明一个类,并从该类创建一个新对象。喜欢:

    public class foo<T>
    {
        public foo() { ... }
    }
    

    然后打电话 foo<String> f = new foo<>(); 。我试图在D中实现相同的方法,但遇到了一个编译错误,如:“classcore.collection.RingBuffer.RingBuffer(T)用作类型”。查看D的教程,我发现通用编程是使用模板实现的。然而,我不能理解这位官员 tutorials/docs 。有人能给我解释一下吗?谢谢

    3 回复  |  直到 6 年前
        1
  •  5
  •   he_the_great    11 年前

    当你没有在右边实例化模板时,就会出现这个错误——它会抱怨“foo被用作一个类型”,因为foo本身还不是一个类型,它是一个类型的模板。这意味着在使用实例化之前,它不会成为实际类型!(参数)。

    您的Java代码 new foo<>() 这并不是D中的情况:在D中,你需要在右边给出类型。

    所以请尝试:

    foo!string f = new foo!string();
    

    foo!(string) f = new foo!(string)();
    

    模板参数后面的括号 ! 如果后面只有一个单词,则是可选的,因此这两个单词的意思相同。

    在D中不需要将类型写两次,但您可以通过类型推理将其从左侧删除,而不是将其从右侧删除。这也将编译:

    auto f = new foo!string();
    

    这在D中很常见。

        2
  •  5
  •   Community Mohan Dere    9 年前

    下面是一个使用泛型的极简Java代码:

    class Foo <T>
    {
        public Foo (String arg) {System.out.println ("Hello, " + arg + "!");}
    }
    
    public class TestClass
    {
        public static void main (String [] args)
        {
            Foo <String> f = new Foo <> ("Alice");
            Foo <String> g = new Foo <String> ("Bob");
        }
    }
    

    这是它的D等价物:

    import std.stdio;
    
    class Foo (T)
    {
        public this (string arg) {writeln ("Hello, " ~ arg ~ "!");}
    }
    
    void main ()
    {
        auto f = new Foo !(string) ("Alice");
        Foo !(string) g = new Foo !(string) ("Bob");
    }
    

    这些只是完整的可编译示例。推理在 Adam D. Ruppe's answer .

        3
  •  0
  •   Vitaly Fadeev    5 年前

    …和默认参数

    template DataList( Data = string )
    {
        class DataList
        {
            Data data;
    
            this()
            {
                // ...
            }
        }
    }
    
    // 
    auto list = new DataList!string();
    
    // readable
    alias DataList!string List;
    
    auto l = new List();