代码之家  ›  专栏  ›  技术社区  ›  0scar

类TypeInfo在D中是键的关联数组?

  •  3
  • 0scar  · 技术社区  · 16 年前

    我希望能够创建多维关联数组,其中一维是一个类。这样地:

    class Node{
        Node[?classType?][string] inputs;
    }
    

    这样我以后就可以做了

    Node[] getInputsOfType(?? aClass){
       if(aClass in this.inputs)
          return this.inputs[aClass];
       else
          return null;
    }
    
    // meanwhile in another file...
    
    Node[] effects = someAudioNode.getInputsOfType(AudioEffect);
    


    关于最后一部分:类本身是否可以像这样作为参数使用( AudioEffect

    比尔

    [更新/解决方案]

    谢谢你的回答!

    我想公布结果会很好。好的,我抬头看了看 .classinfo 在源代码中,发现它返回一个TypeInfo\u类的实例,并且 .name -物业,a string

    #!/usr/bin/env dmd -run
    import  std.stdio;
    class A{
        int id;
        static int newId;
        A[string][string] list;
        this(){ id = newId++; }
        void add(A a, string name){
            writefln("Adding: [%s][%s]", a.classinfo.name, name);
            list[a.classinfo.name][name] = a;
        }
        T[string] getAllOf(T)(){
            return cast(T[string]) list[T.classinfo.name];
        }
    }
    class B : A{ }
    void main(){
        auto a = new A();
        a.add(new A(), "test");
        a.add(new B(), "bclass");
        a.add(new B(), "bclass2");
    
        auto myAList = a.getAllOf!(A);
        foreach(key, item; myAList)
            writefln("k: %s, i: %s id: %s",
                    key, item.toString(), item.id);
    
        auto myBList = a.getAllOf!(B);
        foreach(key, item; myBList)
            writefln("k: %s, i: %s id: %s",
                    key, item.toString(), item.id);
    }
    

    Adding: [classtype.A][test]
    Adding: [classtype.B][bclass]
    Adding: [classtype.B][bclass2]
    Trying to get [classtype.A]
    k: test, i: classtype.A id: 1
    Trying to get [classtype.B]
    k: bclass2, i: classtype.B id: 3
    k: bclass, i: classtype.B id: 2
    

    是的,我想这是可行的。是的!有人有改进的想法吗?

    这里有什么陷阱吗?

    • classinfo.name
    • 有没有合适的方法来获得类名?

    还有,这是最快的方法吗?我是说,所有的班级名称似乎都以 classtype. . 哦,那也许是另一条线索。再次感谢!

    1 回复  |  直到 16 年前
        1
  •  3
  •   Vladimir Panteleev    16 年前

    你可以用 ClassInfo .classinfo 属性)在运行时引用类类型。然而 ClassInfo D reference page on AAs 关于在AAs中使用类/结构)。我想这是可能的,如果您实现了自己的ClassInfo包装器,可以用作AA密钥。这应该相当简单,因为您可以预期一个类类型将只有一个ClassInfo实例,因此您可以简单地使用ClassInfo的地址作为唯一哈希。


    顺便说一下,一种更简单更快的写作方法

    if (key in aa)
        return aa[key];
    else
        return null;
    

    auto pvalue = key in aa;
    return pvalue ? *pvalue : null;