Использование ассоциативного массива, где типом значения является экземпляр std.typecons.Nullable - PullRequest
0 голосов
/ 04 декабря 2018

Впервые на D!У меня есть две функции набора для ввода пар ключ / значение в мой AA.Тот, который берет только ключ (K), и тот, который берет пару (K, V). У меня возникают проблемы:

struct SMap(K,V) {
    private Nullable!(V)[K] stuff; 

void set(K k){                    //Issue is with this one
    if(k in stuff) 
        stuff[k].nullify;
}

void set(K k, V v){
    if(k !in stuff)
        stuff[k] = v;

Если я отрицаю утверждение, то я сталкиваюсь с Rangeошибка.Я знаю, что при вызове nullify я стираю значение в паре с «k» и считаю, что для isNull устанавливается значение true (если я правильно читаю документацию) Как вставить «k» в качестве ключа со значением NULL?

SMap!(int,string) sm;
sm.set(2);

Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

RangeError имеет большой смысл для if(k !in stuff) stuff[k].nullify;.Вы говорите: «Если в stuff нет элемента k, то сделайте что-нибудь с ним».Если этого не существует, вы не можете с ним что-то сделать.Конец.

Более конкретно, что ваш код делает так:

if (k !in stuff) { auto tmp = stuff[k]; // This line throws RangeError, since there is no element k in stuff. tmp.nullify(); stuff[k] = tmp; }

Конечно, это не то, что вы хотите, вы хотите установить егок нулю.Могу ли я предложить это:

void set(K k){ stuff[k] = Nullable!V.init; }

0 голосов
/ 05 декабря 2018

Единственный рабочий ответ, который я наконец понял, был следующий:

if(k in stuff)
    stuff[k].nullify;    //I suppose that this part could actually be deleted.
else{
    Nullable!(V)a;       //Create a Nullable object
    a.nullify;           //nullify it but this part may not be needed
    stuff[k] = a;        //Assign to stuff[k] which sets the isNull data field to true
}
...