連想配列

すっかりその存在を忘れていた連想配列を触ってみた。

import std.c.stdio;

void main(){
    int[char[]] h;
    h["hoge"] = 3;
    h.write();
    h.zero("hoge");
    h.write();
    h["huga"] = 5;
    h.write();
    h.remove("hoge");
    h.write();
    h["hige"] = 6;
    h["foo"] = 1;
    h["bar"] = 2;
    char[][] ac;
    ac = h.keys;
    int[] ai;
    ai = h.values;
    for (int i = 0; i < h.length; i++){
        printf("%.*s %d  ", ac[i], ai[i]);
    }
}

void zero(inout int[char[]] h, char[] c){
    int* p = (c in h);
    if (p != null){
        h[c] = 0;
    }
}

void write(int[char[]] h){
    foreach (char[] c, int i; h){
        printf("%.*s : %d  ", c, i);
    }
    printf("\n");
}
hoge : 3
hoge : 0
hoge : 0  huga : 5
huga : 5
bar 2  huga 5  hige 6  foo 1

配列同様、関数の第一引数を連想配列にしてやることで、連想配列のメソッドのように使えます。undocumented!
removeで普通に取り除ける。某STLみたいな謎挙動はない。
keysとvaluesプロパティでkeyとvalueの動的配列…要素の順番は当然追加順でもなんでもない。
スクリプト言語っぽいなあ。
それにしてもひどいコードですね…
追記。in式なんてものが。