Bevor auch nur darüber nachzudenken, würde ich darauf hinweisen, dass Sie eine einfache Funktion schreiben konnte:
import std.typecons;
Tuple!(K, V) popitem(K, V)(ref V[K] arr) {
foreach(k, v; arr) {
arr.remove(k);
return tuple(k, v);
}
throw new Exception("empty!");
}
void main() {
int[string] cool;
cool["ten"] = 10;
cool["twenty"] = 20;
import std.stdio;
writeln(cool.popitem());
writeln(cool.popitem());
}
Oder mit byKeyValue:
auto popitem(K, V)(ref V[K] arr) {
foreach(item; arr.byKeyValue()) {
arr.remove(item.key);
return item;
}
throw new Exception("empty!");
}
void main() {
int[string] cool;
cool["ten"] = 10;
cool["twenty"] = 20;
import std.stdio;
auto item = cool.popitem();
writeln(item.key, item.value);
item = cool.popitem();
writeln(item.key, item.value);
}
Im Allgemeinen Ich mag Menschen zu ermutigen, nicht zu Angst haben, ihre eigenen Funktionen zu schreiben. Wenn Sie etwas mit ein paar vorhandenen Dingen ausdrücken können, schreiben Sie einfach Ihre eigene Funktion, geben Sie ihr einen Namen, den Sie mögen, und benutzen Sie das! Mit der einheitlichen Funktionsaufrufsyntax können Sie problemlos Erweiterungsmethoden für eingebaute Typen schreiben, wie ich es hier getan habe, und sie verwenden, als ob sie schon immer da gewesen wären.
Ja, Sie können byKeyValue() außerhalb Foreach verwenden, und das ist wahrscheinlich der beste Weg, um zu tun, was Sie wollen. 'assoc.byKeyValue(). popFront()' ... – DejanLekic
@DejanLekic sollten Sie das als Antwort schreiben, ist das Speichern des byKeyValue-Bereichs eine ziemlich elegante Lösung. –
Ich war zu langsam. Deine und CyperShadows Antworten sind gut genug. :) – DejanLekic