Zanim nawet myśleć o tym, bym podkreślić, że można napisać prostą funkcję:
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());
}
lub używając 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);
}
Generalnie chciałbym zachęcić ludzi, aby nie bać się pisania własnych funkcji. Jeśli potrafisz wyrazić coś z kilkoma istniejącymi rzeczami, po prostu napisz swoją własną funkcję, nadaj mu nazwę, którą lubisz i użyj tego! Dzięki jednolitej składni wywołań funkcji można z łatwością pisać metody rozszerzania dla wbudowanych typów, tak jak tu zrobiłem i używać go tak, jakby zawsze był.
Tak, możesz użyć byKeyValue() poza foreach i jest to prawdopodobnie najlepszy sposób robienia tego, co chcesz. 'assoc.byKeyValue(). popFront()' ... – DejanLekic
@DejanLekic powinieneś napisać, że jako odpowiedź, przechowywanie zakresu byKeyValue jest całkiem eleganckim rozwiązaniem. –
Byłem zbyt wolny. Odpowiedzi Your i CyperShadow są wystarczająco dobre. :) – DejanLekic