Bug 9868 – Hash iteration should support counter variable

Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-04-03T12:10:00Z
Last change time
2013-04-07T04:24:03Z
Assigned to
nobody
Creator
andrej.mitrovich

Comments

Comment #0 by andrej.mitrovich — 2013-04-03T12:10:58Z
void main() { string[string] hash; foreach (i, key, val; hash) // ng { } } I think it would be nice to support this, it allows for things like: void main() { string[string] hash = ["foo":"1", "bar":"2"]; string res; foreach (i, key, val; hash) // ng { if (i) res ~= ", "; res ~= key ~ " " ~ val; } assert(res == "foo 1, bar 2"); } A map + joiner call would suffice here of course.
Comment #1 by code — 2013-04-06T20:33:15Z
The problem is there is no index in an unsorted map. But using the known counter from array foreach makes it appear as if there was a relation between i and key/value. I don't think it's worth the possible confusion.
Comment #2 by andrej.mitrovich — 2013-04-07T04:24:03Z
Fair enough. Here's a library workaround when it's really needed: ---- import std.stdio; import std.traits; struct Walk(Hash) if (isAssociativeArray!Hash) { Hash hash; int opApply(int delegate(size_t idx, KeyType!Hash key, ValueType!Hash val) dg) { int result = 0; size_t idx; foreach (key, val; hash) { result = dg(idx++, key, val); if (result) break; } return result; } } auto walk(Hash)(Hash hash) if (isAssociativeArray!Hash) { return Walk!Hash(hash); } void main() { string[string] hash = ["f" : "foo", "b" : "bar"]; foreach (i, key, val; hash.walk) { writefln("%s %s %s", i, key, val); } } ----