Trước khi thậm chí suy nghĩ về nó, tôi muốn chỉ ra rằng bạn có thể viết một hàm đơn giản:
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());
}
Hoặc sử dụng 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);
}
Nói chung, tôi muốn khuyến khích mọi người không để sợ viết các chức năng của chính họ. Nếu bạn có thể diễn tả điều gì đó với một vài thứ hiện có, chỉ cần viết chức năng của riêng bạn, đặt tên cho nó, và sử dụng nó! Với cú pháp gọi hàm đồng nhất, bạn có thể dễ dàng viết các phương thức mở rộng cho các kiểu dựng sẵn, như tôi đã làm ở đây, và sử dụng nó như thể nó luôn ở đó.
Nguồn
2015-06-23 14:11:41
Có, Bạn có thể sử dụng byKeyValue() bên ngoài foreach, và đó có lẽ là cách tốt nhất để làm những gì bạn muốn. 'assoc.byKeyValue(). popFront()' ... – DejanLekic
@DejanLekic bạn nên viết như một câu trả lời, lưu trữ phạm vi byKeyValue là một giải pháp khá thanh lịch. –
Tôi đã quá chậm. Câu trả lời của bạn và CyperShadow là đủ tốt. :) – DejanLekic